如何命名从for循环创建的tkinter条目小部件?

2024-09-28 03:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉python和tkinter,所以在命名for循环中创建的条目小部件时遇到了困难。我的目标是我的图形用户界面解决用户的线性规划优化问题的乐趣。我首先问用户在他们的问题中有多少变量,假设输入了n变量。然后我创建一个for循环,创建与每个变量对应的n条目小部件,以存储该变量的系数值。我知道如何创建一个单条目小部件并命名它,这样我就可以通过name.get()来访问它。在我的代码中,我试图创建一个字符串name=“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()

Tags: textforget部件条目columnrootgrid
2条回答

例如,您可以使用简单的结构来保存vidget,下面是我的一个旧函数中的一个示例:)

就像这里,self.creation_panel是一个dict

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模型中的视图:)。如果它发生了变化,那么从控制器发出信号,得到新的模型并称为新视图。或者类似的,我不记得那个老项目了。在

您可以有一个条目小部件列表。下面我修改了部分代码,以便在创建时将每个条目附加到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进口。对其他人的行动没有帮助,但对你没有帮助。在

相关问题 更多 >

    热门问题