Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill=’both’, expand=True) ; 物件導向避免使用全域變數

加入好友
加入社群
Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

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()

Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

 

GUI(尚未選擇檔案前,

執行程式Button反白不能按):

Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

test.txt:

Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

透過GUI執行後的結果:

Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

from pandas官網:

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)
“””#原本的全域變數fpath,
以self.fpath這個物件變數取代了
#如果一個變數只在一個函數中使用,
就沒有必要將其定義為類的屬性,
可以直接在該函數中定義該變數即可。”””
root = Tk()
app = FileHandler(root)
root.mainloop()

Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

process_button.pack(fill=’both’, expand=True)

Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.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

加入好友
加入社群
Python: 如何用tkinter做出 對話 Button GUI? 點Button即可選擇檔案 ; fpath = filedialog .askopenfilename() ; self.process_button.pack(fill='both', expand=True) ; 物件導向避免使用全域變數 - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *