from tkinter import Tk, Button, filedialog
import pandas as pd
fpath = ""
def browse_file():
global fpath #全域變數 #多個函式共享同一個變數
fpath = filedialog.askopenfilename()
#file dialog兩個英文字 ; ask open file name 四個英文字
print("已經選擇檔案:\n",fpath)
process_button.config(state = "normal")
def process_file():
df = pd.read_csv(fpath, header=None)
print("\n已經讀入DataFrame:\n",df)
root = Tk()
root.title("My App")
root.geometry("250x150")
browse_button = Button(root, text="請選擇檔案",
command = browse_file,
width=20, height=3,
font=("Arial", 12)
)
#command = browse_file
#不是 browse_file(), 也不是 "browse_file"
browse_button.pack()
process_button =Button(root,text="執行程式",
command = process_file,
width=20, height=3,
font=("Arial", 12),
state="disabled")
process_button.pack()
root.mainloop()
GUI(尚未選擇檔案前,
執行程式Button反白不能按):
test.txt:
透過GUI執行後的結果:
pandas.read_csv
pandas.read_csv(filepath_or_buffer, *, sep=_NoDefault.no_default, delimiter=None, header=’infer’, names=_NoDefault.no_default, index_col=None, usecols=None, squeeze=None, prefix=_NoDefault.no_default, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=None, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression=’infer’, thousands=None, decimal=’.’, lineterminator=None, quotechar='”‘, quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, encoding_errors=’strict’, dialect=None, error_bad_lines=None, warn_bad_lines=None, on_bad_lines=None, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options=None)
skip_blank_lines
預設值為True
可以濾掉empty, Tab, 不定數空白
推薦hahow線上學習python: https://igrape.net/30afN
使用了全域變數fpath
,這可能會導致一些問題。
當您的程式碼變得更複雜時,
使用全域變數可能會讓代碼難以理解和維護。
可以使用一個物件導向的方式,
將選擇檔案和處理檔案的功能封裝在一個類別中。
這樣的話,就可以在類別中定義屬性和方法,
並且不需要使用全域變數。
from tkinter import Tk, Button, filedialog
import pandas as pd
class FileHandler:
def __init__(self,root):
self.fpath = ""
root.title("My App")
root.geometry("250x150")
browse_button = Button(root, text="請選擇檔案",
command = self.browse_file,
width=20, height=3,font=("Arial", 12))
#command = browse_file
#不是 browse_file(), 也不是 "browse_file"
browse_button.pack()
process_button = Button(root,text="執行程式",
command = self.process_file,
width=20, height=3,font=("Arial", 12),
state="disabled")
process_button.pack()
def browse_file(self):
# global fpath
self.fpath = filedialog.askopenfilename()
print("已經選擇檔案:\n",self.fpath)
self.process_button.config(state = "normal")
def process_file(self):
df = pd.read_csv(self.fpath, header=None)
print("\n已經讀入DataFrame:\n",df)
root = Tk()
app = FileHandler(root)
root.mainloop()
process_button.pack(fill=’both’, expand=True)
按鈕元素填滿父元素的空間,
並隨著父元素的大小自動調整大小。
fill='both'
是 tkinter 中 pack()
函数的一个选项参数,用于指定部件在可用空间中应该如何扩展。它指定了在水平和垂直方向上都填充可用空间,以填满包含部件的容器。具体而言,它会将部件拉伸到与父容器相同的高度和宽度。
例如,如果一个按钮使用了 pack(side='left', fill='both')
,则它将被放置在父容器的左侧,并且在水平和垂直方向上都会被拉伸,以填充可用空间。
expand=True
是指將該 widget 所在的 row 或 column 填滿,以利於讓 widget 能夠自動調整大小,填滿剩餘的空間。如果 expand=False
,該 widget 只會填滿所需的空間,而不會填滿剩餘的空間。expand
參數通常會與 fill
參數一起使用,以便於控制 widget 在 frame 中的佈局。
推薦hahow線上學習python: https://igrape.net/30afN