我正在尝试创建一系列带有循环的 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()
答案 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 函数。这一次创建了我想要的所有窗口,我可以执行一个操作并退出窗口。这是进步。谢谢,
蒂姆