2014-10-02 64 views
0

我创建了一个简单的程序,在屏幕上显示28个数字。目前,当你点击数字时没有任何反应。最终,我希望这些数字在点击时消失。另外,当你点击'5'时,你会得到5分。我希望在10秒后得分最多的用户赢得这场比赛。但那是为了以后。Python:初始化类中的方法

我的代码是:

from Tkinter import * 
import random 

class Game(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self, parent, background="white") 
     self.parent = parent 
     self.parent.title("Centered window") 
     self.pack(fill=BOTH, expand=1) 
     self.centerWindow() 

    def centerWindow(self): 

     w = 850 
     h = 530 

     sw = self.parent.winfo_screenwidth() 
     sh = self.parent.winfo_screenheight() 

     x = (sw - w)/2 
     y = (sh - h)/2 
     self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y)) 

def main(): 

    global tile_frame_column # the labels that go on the screen of individual numbers 
    tile_frame_column = {} 

    global tiles_make_number # dictionary of all the individual numbers 
    tiles_make_number = {} 

    global tile_frame_column_counter 
    tile_frame_column_counter=0 

    global tiles_make_number_counter 
    tiles_make_number_counter=0 

    global xpos 
    xpos=35 

    global ypos 
    ypos=50 

    tile_numbers = ['1', '2', '3', '4', '5', '6', '1', '2', '1', '2', '1', 'l', '1', '3', '4', '2', '1', '2', '1', '1', '2', '1', '1', '6', '4', '3', '2', '2'] 

    root = Tk() 
    ex = Game(root) 

    def add_number_to_screen(): 
     global tile_frame_column_counter 
     global tiles_make_number_counter 
     global tile_frame_column 
     global xpos 
     global ypos 

     if not tile_numbers: 
      return 

     rand = random.choice(tile_numbers) 
     tile_frame_column[tile_frame_column_counter] = Button(root, text=rand, font="Helvetica 16 bold") 

     tile_frame_column[tile_frame_column_counter].place(x=xpos, y=ypos) 
     tile_numbers.remove(rand) # remove that tile from list of tiles 
     xpos += 80 
     if (len(tiles_make_number) % 7 == 0) & (len(tiles_make_number) > 0): 
      xpos = 35 
      ypos += 80 
      tile_frame_column[tile_frame_column_counter].place(x=xpos, y=ypos) 
      xpos += 80 
      tiles_make_number[tiles_make_number_counter] = rand 
      tile_frame_column_counter += 1 
      tiles_make_number_counter += 1 
      root.after(10, add_number_to_screen) 

    root.after(10, add_number_to_screen) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

我想要的main()函数进行初始化,虽然。每当创建游戏对象时,我都希望它自动添加主要功能 - 意味着将数字添加到屏幕上。我想现在我的代码的方式,当一个游戏对象被创建时,它只会创建屏幕。但是,必须有更好的方法来维护这些代码。还有更好的方法来编写这段代码,所以我不需要所有这些全局变量?

我想重做这样的代码,但它不工作:

from Tkinter import * 
import random 

class Game(Frame): 

    def __init__(self, parent): 
     Frame.__init__(self, parent, background="white") 
     self.parent = parent 
     self.parent.title("Centered window") 
     self.pack(fill=BOTH, expand=1) 
     self.centerWindow() 
     **self.main()** 

    def centerWindow(self): 

     w = 850 
     h = 530 

     sw = self.parent.winfo_screenwidth() 
     sh = self.parent.winfo_screenheight() 

     x = (sw - w)/2 
     y = (sh - h)/2 
     self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y)) 

    **def main(self):** 

     global tile_frame_column # the labels that go on the screen of individual numbers 
     tile_frame_column = {} 

     global tiles_make_number # dictionary of all the individual numbers 
     tiles_make_number = {} 

     global tile_frame_column_counter 
     tile_frame_column_counter=0 

     global tiles_make_number_counter 
     tiles_make_number_counter=0 

     global xpos 
     xpos=35 

     global ypos 
     ypos=50 

     tile_numbers = ['1', '2', '3', '4', '5', '6', '1', '2', '1', '2', '1', 'l', '1', '3', '4', '2', '1', '2', '1', '1', '2', '1', '1', '6', '4', '3', '2', '2'] 

     root = Tk() 
     ex = Game(root) 

     def add_number_to_screen(): 
      global tile_frame_column_counter 
      global tiles_make_number_counter 
      global tile_frame_column 
      global xpos 
      global ypos 

      if not tile_numbers: 
       return 

      rand = random.choice(tile_numbers) 
      tile_frame_column[tile_frame_column_counter] = Button(root, text=rand, font="Helvetica 16 bold") 

      tile_frame_column[tile_frame_column_counter].place(x=xpos, y=ypos) 
      tile_numbers.remove(rand) # remove that tile from list of tiles 
      xpos += 80 
      if (len(tiles_make_number) % 7 == 0) & (len(tiles_make_number) > 0): 
       xpos = 35 
       ypos += 80 
       tile_frame_column[tile_frame_column_counter].place(x=xpos, y=ypos) 
       xpos += 80 
      tiles_make_number[tiles_make_number_counter] = rand 
      tile_frame_column_counter += 1 
      tiles_make_number_counter += 1 
      root.after(10, add_number_to_screen) 

     root.after(10, add_number_to_screen) 
     root.mainloop() 

我所改变的是我加self.main()来构造,把主(个体经营)类游戏和去除。?在“如果 =‘主要’部分但是,当我运行的程序没有任何反应任何人有意见

感谢

+0

是你的问题〜如何组织代码?简而言之, – 2014-10-02 04:43:58

+0

,那是我的问题。但比这还多一点。 – user2456977 2014-10-02 12:25:32

+0

有人能帮忙吗? – user2456977 2014-10-02 13:32:44

回答

-1

此链接会帮助你:http://sebsauvage.net/python/gui/

它解释了如何使用pythonTkInterwxPython正确地构建一个GUI,并且会对您的问题做出精确回答。

总之,最好是让你的类继承Tkinter.Tk,并在if __name__ == "__main__":测试下启动主循环。

+0

我这样做了,但还有一些问题。你能帮忙吗? – user2456977 2014-10-05 02:35:17

+0

解释问题,我们将会看到。 – Doug713705 2014-10-05 12:27:05