2016-12-03 37 views
-1

我想在python3中使用tkinter代码一个非常简单的游戏。这是一个连续的游戏,玩了很多时间。我的问题是,在一段时间结束时,点击“下一个时间段”按钮时,下一个时间段不会加载。这里是我的代码:帧没有加载tkinter

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中的对象编程编程有不正确的理解。任何指针将不胜感激,谢谢。

+0

你做了什么来调试呢?你是否证实了'show_frame'方法被调用?如果您删除'lambda'并使用自定义函数,则更容易。然后,您可以更轻松地添加打印功能或使用调试器停止。 –

+0

谢谢@BryanOakley。我只是做了你的建议(在'show_frame'函数中增加了一个'print'语句,事实上'show_frame'没有被调用,但是我不明白为什么在点击按钮时不会调用它。 – splinter

+0

为了复制这个问题,你真的需要numpy吗?如果不是,你需要将它压缩成不依赖于numpy的东西。 –

回答

1

与上面的评论相反,将print(self.frames)放入show_frame的内部表示show_frame被调用。由于self.frames只有一个项目,{<class '__main__.Period'>: <__main__.Period object .!frame.!period>},并且单个期间对象已经可见,所以.tkraise公开了已经公开的内容并且没有可见的更改。有两种方法可以增加活力。

简单的选项:使一个周期帧,暴露它,并有Next按钮更改内容。如果可能的话可以这样做。

更难的选择:一次或根据需要制作多个周期帧。每个人都有明显不同的内容。公开第一个。然后让按钮暴露下一个。有两个子选项:在eacy其他顶部堆叠相同大小的网格(或打包或放置)框架,并提出你想要看到的一个;或者只是将你想要看到的那个格子化,在开关时没有进行网格划分。如果您需要重新展示之前看到的帧,我只会使用多帧路由。如果您需要,可以使用标签框架小部件(例如ttk.Notebook)来处理堆叠和暴露给您。一个例子是一个窗口可以填充多个表单,每个窗体可以有多种用途。一个特定的例子是IDLE的标签式配置对话框。

+0

谢谢@TerryJanReady。我不需要重新公开先前看到的框架,我只想要按顺序查看时段,一次该按钮已被c舔。在我的代码中,“下一步”按钮确实指的是时间段,所以我不明白为什么没有显示新的时间段。我可以创建Period2,Period3等类。但这并不优雅,必须有一个更简单的方法。 – splinter

+0

我会在一篇新文章中以更好的方式提出这个问题。 – splinter