2017-04-06 43 views
0

我试图在Python 3.4中创建我自己的Go Fish游戏(现在有两个玩家)。我的比赛有两个主要阶段。第一个是确定谁将首先采取行动。这是通过调用我的FirstStage类(file2.py)来完成的,这个类基本上是手游Rock Paper Scissors - 我反对机器人。获得胜利者后,FirstStage会返回一个表示此阶段获胜者的整数(0或1)。然后SecondStage类(file3.py)被称为传递self.winner作为参数。游戏脚本被分割成许多文件,因为我使用了许多类。这是基本的想法,但由于某种原因FistStage没有返回任何东西。有人可以帮助我吗?在这里我的代码:Tkinter - 从一个班级回来,打电话给一个新的

file1.py

from file2 import * 
from file3 import * 
import tkinter as tk 

class start_gui(tk.Frame): 

    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self,parent, *args, **kwargs) 
     # create canvas 
     self.canvas = tk.Canvas(parent, width=800, height=800, background="green") 
     self.canvas.pack() 

     # here we call FirstStage class to determine who starts first 
     self.c = FirstStage(parent) 
     self.winner = self.c.getwinner() 
     #here we call SecondStage call to start the real game 
     self.d = SecondStage(self.winner) 

if __name__ == "__main__": 
    # create main window 
    root = tk.Tk() 
    root.geometry("800x800") 
    start_gui(root) 
    root.mainloop() 

file2.py

import tkinter as tk 
from functools import partial 
from PIL import ImageTk 
from PIL import Image 

class FirstStage(tk.Frame): 

    def __init__(self, canv): 
     tk.Frame.__init__(self, parent, background="black", padx=10, pady=10) 
     self.winner = 0 
     #here new frame is created 
     #buttons and images are place in a grid 
     self.rock_paper_scissors() 

    def rock_papper_scissors(self): 
     #here goes some code 
     #player against API 
     #undefine number of times until there is a winner 


    def close(self, w): 
     self.grid_forget() 
     self.destroy() 
     # here buttons, images and frame are destroy 
     # save winner 
     self.winner = w 

    def getwinner(self): 
     #return int - 0 for player and 1 for robot(opponent) 
     return self.winner 

file3.py

class SecondStage: 
    def __init__(self, winner) 
     #here goes some scripts 
+0

“游戏脚本被分割成许多文件,因为我使用了很多类。”咦? Python不是Java,将多个类放入文件中绝对没有问题。 – jasonharper

回答

0

这是很长,所以我不能将它作为一个评论。

我测试了你的代码,因为它是微小的变化,并且FirstStage返回了正确的赢家,它现在是0或者你在self.winner = 0给出的任何值。

  1. file2.py,你在__init__方法canv但通过 parenttk.Frame.__init__。它给了我错误,因为这些 参数不匹配,因此我将canv更改为parent
  2. rock_paper_scissors在方法定义中的拼写和 方法在__init__方法中的调用方法不同,请检查 拼写。
  3. 您试图在file2.pyclose方法来改变self.winner,但该方法是不是在您所提供的代码的任何地方调用,所以self.winner保持不变(具有0的值)。
  4. 如果您在self.winner = self.c.getwinner()file1.py之后放置print声明,您将意识到获胜者确实返回了 。

如果你做这些改变,但仍没有得到正确的赢家,那么问题可能是你如何在​​Implemeted一个FirstStage;这在问题中没有提供。

这里是我用于测试的代码:

file1.py

from file2 import * 
from file3 import * 
import tkinter as tk 

class start_gui(tk.Frame): 

    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self,parent, *args, **kwargs) 
     # create canvas 
     self.canvas = tk.Canvas(parent, width=800, height=800, background="green") 
     self.canvas.pack() 

     # here we call FirstStage class to determine who starts first 
     self.c = FirstStage(parent) 
     self.winner = self.c.getwinner() 
     print(self.winner) 
     #here we call SecondStage call to start the real game 
     self.d = SecondStage(self.winner) 

if __name__ == "__main__": 
    # create main window 
    root = tk.Tk() 
    root.geometry("800x800") 
    start_gui(root) 
    root.mainloop() 

file2.py

import tkinter as tk 
from functools import partial 
from PIL import ImageTk 
from PIL import Image 

class FirstStage(tk.Frame): 

    def __init__(self, parent): 
     tk.Frame.__init__(self, parent, background="black", padx=10, pady=10) 
     self.winner = 0 
     #here new frame is created 
     #buttons and images are place in a grid 
     self.rock_paper_scissors() 

    def rock_paper_scissors(self): 
     pass 
     #here goes some code 
     #player against API 
     #undefine number of times until there is a winner 


    def close(self, w): 
     self.grid_forget() 
     self.destroy() 
     # here buttons, images and frame are destroy 
     # save winner 
     self.winner = w 

    def getwinner(self): 
     #return int - 0 for player and 1 for robot(opponent) 
     return self.winner 

file3的。py

class SecondStage: 
    def __init__(self, winner): 
     pass 
     #here goes some scripts 
+0

对不起,我发布的问题上的函数rock_paper_scissors出现拼写错误,但未在我的原始脚本中。另外,self.winner在FirstStage类的某个地方被改变了,但我没有写在我的文章中,因为我的脚本有数百行。 – JOrG

+0

基本上,FirstStage类进入循环,直到我们找到胜利者。 – JOrG

相关问题