如標題所述,如何防止在 Tkinter 中使用全域變數?我已經開始學習 Tkinter,并且幾乎在我的所有專案中都遇到了問題。我遇到的問題是大多數小部件需要相互互動,從而產生很多依賴關系。下面是我的一個有這個問題的專案的代碼。我包含了這個專案的所有代碼,因為問題出現在整個代碼中。
以apply_filter 函式為例。為了接收來自用戶的輸入,Apply Filter 按鈕的命令功能需要訪問輸入欄位。解決此問題的一種方法是將所有輸入欄位作為引數傳遞給命令函式。但是,我不喜歡這個選項,因為這意味著我要么必須將所有代碼放在巨大的塊中,使代碼更難閱讀,要么必須通過多個函式傳遞它,從而導致相同的結果。我在這里選擇的選項是使輸入全域化,以便我可以從代碼中的任何位置訪問它們。至少代碼更容易閱讀。當然,這可能不是一個好的解決方案。當 GUI 擴展時,這將產生大量的依賴關系,很容易導致錯誤。
長話短說,我想知道:有沒有更好的方法來處理這些依賴關系,這樣我就不需要創建大量的全域變數或創建不可讀的代碼?預先感謝您所做的任何努力。
import tkinter as tk
from tkinter import filedialog as fd
import pandas as pd
import numpy as np
import sys
start_filter_row = 0
start_filter_column = 0
data_location = ""
df = None
root = None
filterr = {"customercode":{"column name": "Customer (code)", "value": None, "row_number": start_filter_row},
"partnr":{"column name": "Part nr", "value": None, "row_number": start_filter_row 1},
"partclass":{"column name": "Part class", "value": None, "row_number": start_filter_row 2},
"partfamily":{"column name": "Part familiy", "value": None, "row_number": start_filter_row 3},
"startdate":{"column name": "Transaction date", "value": None, "row_number": start_filter_row 4},
"enddate":{"column name": "Transaction date", "value": None, "row_number": start_filter_row 5}
}
inputs = dict()
'''
Load Data
'''
def load_dataset():
global df
root.update()
database_location = fd.askopenfilename()
df = load_data(database_location)
def load_data(database_location):
try:
df = pd.read_pickle(database_location)
return df
except Exception as e:
print("Data location not set!", e)
root.destroy()
sys.exit()
'''
create Widgets
'''
def create_filter_inputs():
for key, value in filterr.items():
label = tk.Label(root, text = key)
label.grid(row = value["row_number"], column = start_filter_column, sticky = "w")
entry = tk.Entry(root)
entry.focus_set()
entry.grid(row = value["row_number"], column = start_filter_column 1, sticky = "w")
inputs[key] = entry
def create_filter_buttons():
apply_button = tk.Button(root, text = "Apply Filter", command = apply_filter)
apply_button.grid(row = start_filter_row len(filterr), column = 0, sticky = "news")
clear_button = tk.Button(root, text = "Clear Filter", command = clear_filter)
clear_button.grid(row = start_filter_row len(filterr), column = 1, sticky = "news")
'''
Button functions
'''
def clear_filter():
for key, entry in inputs.items():
entry.delete(0, 'end')
apply_filter()
def apply_filter():
for key, entry in inputs.items():
filterr[key]["value"] = entry.get().split(";")
def main():
global data_location, root
'''
Setting up Tkinter Frame and loading dataset
'''
root = tk.Tk()
root.title("Data Tool V0.1")
loading_label = tk.Label(root, text = "Loading...", width = 30, height = 5)
loading_label.pack()
load_dataset()
loading_label.destroy()
n_rows, n_cols = (4, 3)
root.columnconfigure(tuple(range(n_cols)), weight=1)
root.rowconfigure(tuple(range(n_rows)), weight=1)
'''
Setting up GUI
'''
create_filter_inputs()
create_filter_buttons()
root.mainloop()
if __name__ == "__main__":
main()
uj5u.com熱心網友回復:
您可以通過將 GUI 轉換為類格式并將它們設為類變數來避免使用全域變數。
class GUI:
def __init__():
.....
self.myvariable = ...
def function():
newvar = self.myvariable - 5
還值得注意的是,在函式外部定義的變數可以從函式內部看到,反之則不行:
>>> def f(a):
... print(a)
...
>>> b=2
>>> f(b)
2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474305.html
