用PythonTkinter玩的石头剪纸游戏
我想用面向对象的方法来分离GUI和游戏逻辑,但是当我试图用tkinter来显示“self.result”时,将其标记为show“PY VAR1”。 有人能帮我更新self.result吗 rockpaperscissor.py用PythonTkinter玩的石头剪纸游戏,python,tkinter,Python,Tkinter,我想用面向对象的方法来分离GUI和游戏逻辑,但是当我试图用tkinter来显示“self.result”时,将其标记为show“PY VAR1”。 有人能帮我更新self.result吗 rockpaperscissor.py import random class RockPaperScissor: def __init__(self): self.rock = 'rock' self.paper = 'paper' self.sci
import random
class RockPaperScissor:
def __init__(self):
self.rock = 'rock'
self.paper = 'paper'
self.scissor = 'scissor'
self.playerA_win = 'player A win'
self.playerB_win = 'player B win'
self.draw = 'Its draw'
self.playerA_score = 0
self.playerB_score = 0
self.choices = {'rock': self.rock,
'paper': self.paper,
'scissor': self.scissor}
self.transition = {
(self.rock, self.rock): self.draw,
(self.rock, self.paper): self.playerB_win,
(self.rock, self.scissor): self.playerA_win,
(self.paper, self.rock): self.playerA_win,
(self.paper, self.paper): self.draw,
(self.paper, self.scissor): self.playerB_win,
(self.scissor, self.rock): self.playerB_win,
(self.scissor, self.paper): self.playerA_win,
(self.scissor, self.scissor): self.draw}
def play(self, playerA, playerB):
self.playerA_answer = self.choices[playerA]
self.playerB_answer = self.choices[playerB]
self.result = self.transition[self.playerA_answer,
self.playerB_answer]
def get_result(self):
return self.result
def computer():
choices = ('rock', 'paper', 'scissor')
playerB = random.choice(choices)
return playerB
if __name__ == "__main__":
rps = RockPaperScissor()
while True:
playerA = input('What is your guess? ')
playerB = computer()
rps.play(playerA,playerB)
print(rps.get_result())
及
rockpaperscissor_gui.py
import tkinter as tk
import rockpaperscissor as rps
class MyFrame(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.value = tk.StringVar()
self.result = tk.StringVar()
self.choice = ('rock', 'paper', 'scissor')
self.rps = rps.RockPaperScissor()
for i in self.choice:
self.radio = tk.Radiobutton(self,
text=i,
variable=self.value,
value=i).pack()
self.button = tk.Button(self,
text='play',
command=self.play).pack()
self.label = tk.Label(self,
text=self.result).pack()
def play(self):
playerA = self.value.get()
playerB = rps.computer()
self.rps.play(playerA, playerB)
self.result.set('result: {0}'.format(self.result))
if __name__ == '__main__':
MyFrame().mainloop()
这是屏幕截图感谢您的回答,现在它可以工作了! 这是新代码
#rockpaperscissor_gui.py
import tkinter as tk
import random as rn
import rockpaperscissor as rps
class RockPaperScissor:
def __init__(self):
self.rps = rps.RockPaperScissor()
self.root = tk.Tk()
self.playerA = tk.StringVar()
self.playerA.set('Pick your answer')
self.playerB = tk.StringVar()
self.playerB.set('Pick your answer')
self.result = tk.StringVar()
self.rps.playerA_score = tk.StringVar()
self.rps.playerB_score = tk.StringVar()
self.choices = ('rock', 'paper', 'scissor')
self.label_choices = (self.playerA, self.playerB, self.result)
for item in self.label_choices:
self.label = tk.Label(self.root, textvariable=item)
self.label.pack()
for item in self.choices:
self.radiobutton = tk.Radiobutton(self.root, text=item,
variable=self.playerA,
value=item)
self.radiobutton.pack()
self.button = tk.Button(self.root,
text='update',
command=self.update).pack()
self.root.mainloop()
def update(self):
self.playerB_answer = rn.choice(self.choices)
self.playerB.set(self.playerB_answer)
player = self.playerA.get()
computer = self.playerB.get()
self.rps.play(player, computer)
answer = self.rps.get_result()
self.result.set(answer)
if __name__ == '__main__':
RockPaperScissor()
您必须在
Label
中使用textvariable
,并显示self.rps.get\u result()
顺便说一句:如果不使用此变量,则不必将小部件分配给变量
代码可能是这样的
import tkinter as tk
import rockpaperscissor as rps
class MyFrame(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.value = tk.StringVar()
self.result = tk.StringVar()
self.choice = ('rock', 'paper', 'scissor')
self.rps = rps.RockPaperScissor()
for i in self.choice:
tk.Radiobutton(self,
text=i,
variable=self.value,
value=i).pack()
tk.Button(self, text='play', command=self.play).pack()
tk.Label(self, textvariable=self.result).pack() # textvariable
def play(self):
playerA = self.value.get()
playerB = rps.computer()
self.rps.play(playerA, playerB)
self.result.set('result: {0}'.format(self.rps.get_result())) # get_result()
if __name__ == '__main__':
MyFrame().mainloop()
这里没有问题。我想更新标签,但它显示“PY VAR1”。你可能想阅读此内容并相应调整你的问题。我试图使用tkinter.Label显示“self.result”,但我不知道如何显示,它显示“PY VAR1”。我想你使用了错误的变量
self.result
是tk.StringVar()
-您必须显示self.rps.get\u result()