【问题标题】:tkinter: use single button with multiple frames and functionstkinter:使用具有多个框架和功能的单个按钮
【发布时间】:2017-03-05 17:16:50
【问题描述】:

我有一个名为“页面”的列表,其中包含多个帧 x1 到 x5。我希望能够使用 tkraise() 在它们之间导航。 x1 框架的中心只有一个下一个按钮,可以提升 x2,x5 的中间只有一个上一个按钮,可以提升 x4。帧 x2 到 x4 将具有下一个和上一个按钮,它们将相应地提升下一个和上一个帧,并且必须调整按钮的位置以使它们彼此相邻。

是否有可能通过 for 循环仅使用一个上一个和下一个按钮来实现所有这些?我能够使用我的 for 循环在 x2 到 x4 帧中获得上一个/下一个按钮,但我不确定该命令应该放什么,以便他们可以提升相应的上一个/下一个帧(我把 ? 放在 lambda 旁边)。可能有人请帮忙。

from tkinter import *

root = Tk()

box = Frame(root)
box.pack(fill=BOTH, expand=True)
box.grid_columnconfigure(0, weight=1)
box.grid_rowconfigure(0, weight=1)

x1 = Frame(box, bg="gainsboro")
x1.grid(row=0, sticky="nsew")

x2 = Frame(box, bg="red")
x2.grid(row=0, sticky="nsew")

x3 = Frame(box, bg="blue")
x3.grid(row=0, sticky="nsew")

x4 = Frame(box, bg="green")
x4.grid(row=0, sticky="nsew")

x5 = Frame(box, bg="snow")
x5.grid(row=0, sticky="nsew")

frames = [x1, x2, x3, x4, x5]

next_button = Button(frames[0], text="Next", command=lambda: frames[1].tkraise())
next_button.pack()

previous_button = Button(frames[-1], text="Previous", command=lambda: frames[-2].tkraise())
previous_button.pack()

for x in frames[1:4]:
    next_button_2 = Button(x, text="Next", command=lambda: ?)
    next_button_2.pack(side=RIGHT)

    previous_button_2 = Button(x, text="Previous", command=lambda: ?)
    previous_button_2.pack(side=LEFT)

x1.tkraise()

root.mainloop()

【问题讨论】:

    标签: python loops for-loop tkinter


    【解决方案1】:

    迭代frames[1:4] 在这里不会很好地工作,因为它让您无法轻松获取下一帧/上一帧。尝试迭代索引:

    for i in range(1,4):
        nb = Button(frames[i], text="Next", command=frames[i+1].tkraise)
        nb.pack(side=RIGHT)
        pb = Button(frames[i], text="Previous", command=frames[i-1].tkraise)
        pb.pack(side=LEFT)
    

    注意:我只是将 tkraise 方法本身设置为命令,而不是 lambdas。这是可能的,因为它不接受任何参数。否则,您会在循环中遇到 lambdas 的常见问题:它们访问的任何局部变量将始终与它们在循环的最后一次迭代期间具有的值一起看到。如果您想使用 lambda,您必须捕获 i 的值作为参数:例如 lambda i=i: frames[i+1].tkraise()

    实际上,在同一个循环中处理结束情况会相当简单,从而节省了一些代码重复:

    for i in range(len(frames)):
        if i != len(frames) - 1:
            nb = Button(frames[i], text="Next", command=frames[i+1].tkraise)
            nb.pack(side=RIGHT)
        if i != 0:
            pb = Button(frames[i], text="Previous", command=frames[i-1].tkraise)
            pb.pack(side=LEFT)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2023-03-17
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多