我需要一種方法來處理 TKinter 中的多個小部件,例如 for 回圈中的標簽、條目或比例,然后再對其進行編輯。它是更大的 GUI 的一部分,如果沒有解決方案,代碼將太長且令人困惑。下面的例子應該能解釋這個問題。
import tkinter as tk
import tkinter.ttk as ttk
class NewprojectApp:
def __init__(self, master=None):
# build the GUI
self.frame1 = ttk.Frame(master)
self.scale1 = tk.Scale(self.frame1)
self.scale1.configure(label="scale2", orient="horizontal")
self.scale1.grid(column="0", row="1")
self.scale2 = tk.Scale(self.frame1)
self.scale2.configure(label="scale3", orient="horizontal")
self.scale2.grid(column="0", row="2")
self.scale3 = tk.Scale(self.frame1)
self.scale3.configure(label="scale4", orient="horizontal")
self.scale3.grid(column="0", row="3")
self.button1 = ttk.Button(self.frame1)
self.button1.configure(text="set default value")
self.button1.grid(column="0", pady="5", row="4")
self.button1.configure(command=self.set_value)
self.frame1.configure(height="200", width="200")
self.frame1.grid(column="0", row="0")
# Main widget
self.mainwindow = self.frame1
def run(self):
self.mainwindow.mainloop()
def set_value(self):
# set the value of multiples scales to a new value
self.scale1.set(20)
self.scale2.set(20)
self.scale3.set(20)
"""
I want to change functions like the one above into for loops;
The following is something I tried out but that didn't work
for i in range(1,3):
current_scale = 'self.scale' str(i)
current_scale.set(20)
"""
if __name__ == "__main__":
root = tk.Tk()
app = NewprojectApp(root)
app.run()
非常感謝您!
uj5u.com熱心網友回復:
您要實作的目標有不同的選擇。
為了保持for回圈,您可以執行以下操作:
def set_value(self):
for i in range(1, 4):
getattr(self, f'scale{i}').set(20)
這樣,您就可以正確地使用i變數來尋址小部件。顯然,您應該注意處理正確的小部件(例如,為 設定 a default,getattr或使用 a try,或確保hasattr(self, scale{i}))
另一種方法可能是迭代 的元素self,并在適當的時候運行set:
def set_value(self):
for widget_name in dir(self):
widget = getattr(self, widget_name)
if isinstance(widget, tk.Scale): # ensure widget is of Scale class
widget.set(20)
最后,您可以簡單地定義要迭代的小部件串列:
class NewprojectApp:
def __init__(self, master=None):
# build the GUI
self.frame1 = ttk.Frame(master)
self.button1 = ttk.Button(self.frame1)
self.button1.configure(text="set default value")
self.button1.grid(column="0", pady="5", row="4")
self.button1.configure(command=self.set_value)
self.frame1.configure(height="200", width="200")
self.frame1.grid(column="0", row="0")
# Define your scales
self.scales = []
for i in range(1, 4):
self.scales.append(tk.Scale(self.frame1))
self.scales[-1].configure(label=f"scale{i}", orient="horizontal")
self.scales[-1].grid(column=0, row=i)
# You could also initiate your scales indipendently and then do:
# self.scales = [scale1, scale2, scale3]
# Main widget
self.mainwindow = self.frame1
def run(self):
self.mainwindow.mainloop()
def set_value(self):
for scale in self.scales:
scale.set(20)
在這種情況下,當您要處理單個比例時,您必須注意。您也可以同時保留self.scale{i}和self.scales。
可能有許多其他方法可以達到結果,但您可以從這里開始,找到最適合您的方法:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/468259.html
