我正在创建一个基本的摇滚纸剪刀游戏来熟悉python和tkinter。我想创建一个gui和一个逻辑类来分离两者。但是,我似乎无法找到在python中都有效的代码布局,这对我来说很有意义。如何正确组织此代码?
我想Gui
类只知道小部件并更新它们。
class Gui:
def setup(self):
root = Tk.Tk()
root.geometry("370x170")
root.resizable(width=False, height=False)
root.title("Rock, Paper, Scissors")
root.iconbitmap("Play.ico")
rock_button = Tk.Button(root, text="Rock", command=rock_clicked)
rock_button.place(width=100, height=30, x=10, y=30)
paper_button = Tk.Button(root, text="Paper", command=paper_clicked)
paper_button.place(width=100, height=30, x=10, y=70)
scissors_button = Tk.Button(root, text="Scissors", command=scissors_clicked)
scissors_button.place(width=100, height=30, x=10, y=110)
score_font = font.Font(family="Helvetica", size=20)
own_score_lbl = Tk.Label(root, text="0", relief=Tk.RIDGE, font=score_font)
own_score_lbl.place(width=50, height=110, x=120, y=30)
ai_score_lbl = Tk.Label(root, text="0", relief=Tk.RIDGE, font=score_font)
ai_score_lbl.place(width=50, height=110, x=200, y=30)
ai_choice = Tk.Label(root, relief=Tk.RIDGE)
ai_choice.place(width=100, height=110, x=260, y=30)
root.mainloop()
gui = Gui()
gui.setup()
在其他语言中,我习惯于在gui类中有一个逻辑成员变量,反之亦然。这在这里不起作用。由于参数self
,点击处理函数不能是逻辑类的成员。所以我试图将它们声明为模块级别,并从那些调用逻辑类的方法,这也没有解决。理想情况下,在点击事件之后,我希望调用一个逻辑类方法,然后进行计算,并调用适当的gui方法,即返回set_label_text()
。
我该如何用OO设计来实现?
我从你的答案中得到了一些想法,但仍然这样,逻辑代码将在名为Gui的类中定义。这是我试图避免的事情之一。 – Innkeeper
@Innkeeper我会尝试通过使用Mixins来解决它 –
@Innkeeper我没有通过mixins(运行到无穷循环)来管理它,但通过将'logic'对象传递给Gui构造函数来管理它。这可能会更容易阅读mixin。 –