在循环中创建相互引用的 Tkinter 按钮

时间:2021-07-20 03:47:26

标签: python tkinter

我正在尝试创建一系列带有循环的 tkinter 按钮,这些按钮是 .grid'd 到它们各自的框架。我希望每个按钮都有一个功能,可以 .tkraises 我创建的帧列表中的下一帧。知道怎么做吗?这就是我所拥有的。我认为创建了按钮/框架,但 .tkraise 功能不起作用。谢谢

from tkinter import *
from PIL import ImageTk, Image

## Define root and geometry
root = Tk()
root.geometry('200x200')

# Define Frames
winlist = list()
winlist = Frame(root, bg='red'), Frame(root, bg='green'), Frame(root, bg='blue')

# Configure Rows
root.grid_rowconfigure(0, weight = 1)
root.grid_columnconfigure(0, weight = 1)

# Place Frames
for window in winlist:
    window.grid(row=0, column = 0, sticky = 'news')

# Raises first window 'To the top'
winlist[0].tkraise()

# Function to raise 'window' to the top
def raise_frame(window):
    window.tkraise()

d = {}
count = 0
for x in range(0, 3):
    d["label{0}".format(x)] = Label(winlist[x], text = "label{0}".format(x))
    if count <=1:
        try:
            d["button{0}".format(x)] = Button(winlist[x], text = "button{0}".format(x), command = raise_frame(winlist[x+1]))
            d["button{0}".format(x)].pack(side=TOP)
        except:
            pass
    else:
        d["label{0}".format(x)].pack(side=TOP)
    count += 1

root.mainloop()

2 个答案:

答案 0 :(得分:1)

问题出在该行的 command 选项上:

d["button{0}".format(x)] = Button(winlist[x], text = "button{0}".format(x), command = raise_frame(winlist[x+1]))

它将立即执行 raise_frame(winlist[x+1]),然后将结果(即 None)分配给 command 选项。因此,稍后单击该按钮将不起作用。

您需要改用 lambda

d["button{0}".format(x)] = Button(winlist[x], text="button{0}".format(x),
                                  command=lambda x=x: raise_frame(winlist[x+1]))

答案 1 :(得分:0)

我回答了我自己的问题。我没有使用框架,而是回到创建 Tk() 对象。我创建了一个循环,该循环运行一个创建 Tk() 对象的函数,并传入一个包含循环计数的变量。我使用该计数来更改每个 Tk() 对象的信息,而是让每个按钮的“command =”包含一个 Tk().destroy 函数。这一次创建了我想要的所有窗口,我可以执行一个操作并退出窗口。这是进步。谢谢,

蒂姆