[英]How to name tkinter entry widgets created from a for loop?
我是python和tkinter的新手,所以我無法命名在for循環內創建的條目小部件。 我的GUI的目標是為用戶解決線性編程優化問題。 我首先問用戶問題中有多少個變量,假設輸入了n個變量。 然后,我創建一個for循環,該循環創建與每個變量相對應的n個條目小部件,以存儲該變量的系數值。 我知道如何創建單個條目窗口小部件並命名它,以便可以通過名稱 .get()訪問它。 在我的代碼中,我嘗試創建一個字符串名稱 =“ x” + str(i),其中i是for循環遞增變量。 但是然后當我例如調用x1.get()時,我得到一個錯誤,即未定義x1。 我該如何解決? 並感謝您的事先幫助。
import tkinter as tkr
def objCos():
x1Co = x1.get()
print(x1Co)
def objFunction():
global varFrame
numOfVars = ofEntry.get()
numOfVars = int(numOfVars)
varFrame.destroy()
varFrame = tkr.Frame(root)
varFrame.pack(side = tkr.BOTTOM)
varLabel = tkr.Label(varFrame, text = "Enter Objective Function Coefficients: ")
varLabel.grid(row = 0, columnspan = 2)
for i in range(1,numOfVars+1):
strName = 'x' + str(i)
strName = tkr.Entry(varFrame)
strName.grid(row = i, column = 1)
lbName = "varLabel" + str(i)
lbName = tkr.Label(varFrame, text = "x"+ str(i) + " = ")
lbName.grid(row = i, column = 0)
varButton = tkr.Button(varFrame, text = "Update Objective Function Coefficients",
bg = "light grey", command = objCos)
varButton.grid(row = numOfVars + 1, columnspan = 2)
root = tkr.Tk()
ofFrame = tkr.Frame(root)
ofFrame.pack(side = tkr.TOP)
global varFrame
varFrame = tkr.Frame(root)
varFrame.pack(side = tkr.BOTTOM)
ofLabel = tkr.Label(ofFrame, text = "Enter Number of Variables: ")
ofLabel.grid(row = 0, column = 0)
ofEntry = tkr.Entry(ofFrame)
ofEntry.grid(row =0, column = 1)
ofButton = tkr.Button(ofFrame, text = "Update Number of Variables",
bg = "light grey", command = objFunction)
ofButton.grid(row = 1, columnspan = 2)
root.mainloop()
您可以有一個條目小部件列表。 下面,我修改了部分代碼,以將每個條目添加到創建時的entries
中。
entries = []
for i in range(1,numOfVars+1):
entries.append(tkr.Entry(varFrame))
entries[-1].grid(row = i, column = 1) # Grid the last item in entries
lbName = "varLabel" + str(i)
lbName = tkr.Label(varFrame, text = "x"+ str(i) + " = ")
lbName.grid(row = i, column = 0)
您可以使用該列表訪問以后輸入的數據。
另外,tkinter通常作為tk而不是tkr導入。 它不會影響操作,但可以幫助其他人了解您所做的事情。
例如,您可以使用簡單的結構保存vidgets,這是我的一個舊函數中的示例:)
像那里一樣, self.creation_panel
是一個字典。
def creation_view(self, core_line, skills_line):
#### Navigate functions for main menu ####
def set_navigate(self, arg):
self.navigate = arg
#### Configurations for create interference ####
self.configure_grid_x(20)
self.configure_grid_y(5)
row = 0
col = 0
#### Create body of view ####
for txt in core_line:
if col == 12:
col = 0
row += 1
self.creation_panel[txt] = Button(self.frame, text=txt, command=lambda cls=self, arg=txt: set_navigate(cls, arg))
self.creation_panel[txt].grid(row=row, column=col, columnspan=3, sticky=NSEW)
col += 3
for txt in skills_line:
if col == 12:
col = 0
row += 1
self.creation_panel[txt] = Button(self.frame, text=txt, state=DISABLED, command=lambda cls=self, arg=txt: set_navigate(cls, arg))
self.creation_panel[txt].grid(row=row, column=col, columnspan=4, sticky=NSEW)
col += 4
self.creation_panel["Preview"] = Button(self.frame, text="Preview", command=lambda cls=self: set_navigate(cls, "Preview"))
self.creation_panel["Preview"].grid(row=row+1, column=0, columnspan=12, sticky=NSEW)
self.preview_window1 = Label(self.frame, text="", justify=LEFT)
self.preview_window1.grid(row=0, rowspan=5, column=12, columnspan=4, sticky=NSEW)
self.preview_window1.config(state='disabled', relief=SUNKEN)
self.preview_window2 = Label(self.frame, text="", justify=LEFT)
self.preview_window2.grid(row=0, rowspan=5, column=16, columnspan=4, sticky=NSEW)
self.preview_window2.config(state='disabled', relief=SUNKEN)
self.frame.pack(side=LEFT, fill=BOTH, expand=1)
也許這不是最好的方法,還有其他方法可以糾正我。 但是有一種可能的方法。
self.navigate
變量用於導航,因為該類僅表示GUI的MVC模型中的視圖:)。 如果已更改,則從控制器發送信號,獲取新模型並調用新視圖。 或類似的方式,我不清楚地記得那個舊項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.