【发布时间】:2017-04-18 13:14:00
【问题描述】:
我正在尝试在 python3 中使用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 中的面向对象编程的理解不正确。任何指点将不胜感激,谢谢。
【问题讨论】:
-
你做了什么来调试这个?您是否确认正在调用
show_frame方法?如果您删除lambda并使用自定义函数,这会更容易。然后,您可以更轻松地添加打印功能或使用调试器停止。 -
谢谢@BryanOakley。我只是按照你的建议做了(在
show_frame函数中添加了一个小的print语句。确实,show_frame没有被调用。但我看不出如果单击按钮不会调用它的原因。 -
你真的需要 numpy 来复制这个问题吗?如果没有,你需要把它浓缩成不依赖于 numpy 的东西。
-
我建议您阅读google.com/search?q=mcve&ie=utf-8&oe=utf-8 并将您的代码减少到显示问题所需的最低限度。以后不要随便写这么多没有测试的代码。
-
谢谢@TerryJanReedy。我已按照您的指示缩短了代码,删除了我感兴趣的问题不需要的代码行。
标签: python python-3.x oop user-interface tkinter