关于python:框架没有加载tkinter

Frame not loading with tkinter

我试图用python3中的tkinter编写一个非常简单的游戏。这是一个连续的游戏,玩了很多次。我的问题是,在周期结束时,单击"下一个周期"按钮时,下一个周期不会加载。这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import tkinter as tk
from tkinter import ttk

class Game(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        F=Period
        frame = F(container, self)
        self.frames[F] = frame
        frame.grid(row=0, column=0, sticky='nsew')

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class Period(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)

        firstOffer = 5

        labelOffer = tk.Label(self, anchor='center', text=str(firstOffer))
        labelOffer.place(anchor='center', relx=0.6, rely=0.5)  

        buttonAcc = ttk.Button(self, text='Accept', command=lambda: self.PeriodSummary(parent, controller))
        buttonAcc.place(anchor='center', relx=0.35, rely=0.5)          

    def PeriodSummary(self, parent, controller):

        buttonNextPeriod = ttk.Button(self, text='Next Period', command=lambda: controller.show_frame(Period))
        buttonNextPeriod.place(anchor='center', relx=0.5, rely=0.75, width=200, height=80)          

app = Game()
app.wm_state('zoomed')
app.mainloop()

如代码运行时所见,当用户单击"下一个周期"时,什么也不会发生。我想开始一个新的时期。我相信我对Python中面向对象编程的理解是错误的。任何建议都会受到高度赞赏,谢谢。


与你上面的评论相反,把print(self.frames)放在show_frame里面,说明show_frame正在被调用。由于self.frames只有一个项目,{: <__main__.Period object .!frame.!period>}且单周期对象已经可见,所以.tkraise暴露了已经暴露的内容,没有明显的变化。增加活力有两种方法。

简单的选择:制作一个句点框架,曝光它,并让Next按钮更改内容。如果可能的话就这么做。

更难的选择是:一次性或根据需要制作多个周期帧。每个都有明显不同的内容。暴露第一个。然后让按钮露出下一个。有两个子选项:将大小相同的网格化(或打包或放置)框架堆叠在另一个框架的顶部,并提升要查看的框架;或仅对要查看的框架进行网格化,在进行切换时取消网格化。如果您需要重新公开以前看到的帧,我只会选择多帧路径。如果需要,请使用一个选项卡式框架小部件,如ttk.notebook,它为您处理堆叠和曝光。一个例子是一个有多个表单要填充的窗口,每个表单可能有多个用途。一个特殊的例子是Idle的选项卡式配置对话框。