【问题标题】:Creating Windows in a 'For Loop' (Python)在“For循环”中创建窗口(Python)
【发布时间】:2015-02-03 01:04:22
【问题描述】:

我一直在使用 Python 创建游戏,并且在我的一个函数中,

def Enemy_Party(enemies, party):
        def Sub_Fight(member, enemy, enemies, Prep):
            Prep.destroy()
            Fight(member, enemy, enemies)
        for x in enemies:
            Prep = Tk()
            for y in party:
                button = Button(Prep, text=y.name, command=Sub_Fight(y, x, enemies, Prep)).pack()
            Prep.mainloop()

创建了一个窗口,但其中没有任何内容。没有错误消息,空白窗口就在那里。

是的,我有一个函数 Fight,它确实需要四个参数。 'enemies' 和 'party' 都被定义为列表,并且在其中都有值(我已经检查过)。

对此,我有两个问题:“为什么程序在创建一个空白窗口后会停止?”和“你能在'For循环'中定义窗口吗?

如果您需要更多代码,请告诉我,提前致谢。

【问题讨论】:

  • 您的 sn-p 对演示正在发生的事情没有多大帮助。您能否提供minimal working example 证明您遇到的问题?
  • 另外,这个button = Button(Prep, text=y.name, command=Sub_Fight(y, x, enemies, Prep)).pack() 将导致按钮为空。原因是 pack 返回 null。也许这是您遇到的问题的一部分?

标签: python function for-loop tkinter window


【解决方案1】:

程序在第一次调用 mainloop 时停止,因为这就是 mainloop 所做的 - 在您销毁窗口之前它不会返回。

您对如何创建窗口存在根本性的误解。每个 tkinter 应用程序都需要一个 单个 Tk 实例。要创建其他窗口,您需要创建Toplevel 的实例。然后,您需要只调用一次mainloop

在您的代码中,将对Tk 的调用替换为对Toplevel 的调用,然后在您的函数中删除对mainloop 的调用。在创建了所有小部件之后,您可能会在代码中的其他地方调用mainloop

【讨论】:

    【解决方案2】:

    我注意到您在 for 循环中定义了 Tk()。根据此循环的迭代次数,您可能会创建许多 Tk() 实例,而实际上您永远不应该创建多个实例。我建议在循环之外创建您的窗口并根据需要使用循环填充它(或您可能决定使用的任何其他内容)。

    【讨论】:

    • 我实际上是在尝试创建多个窗口,每个“y in party”都有一个。那可能吗?如果没有,我可以为每个“y”创建一个框架吗?
    • 是的,你可以有多个窗口,但只有一个“主”窗口(Tk())。任何额外的窗口都需要使用 Toplevel() 来定义。即,准备 = 顶层()。你可能需要检查一下,但我也很确定每个窗口都需要一个唯一的名称,所以它们不能都是“准备”。
    • 谢谢,效果很好! .附言该程序设法使用循环创建了两个名为 Prep 的窗口。
    • 好的,不错。我不确定命名的东西很好听。
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2019-01-31
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多