Python:在类中初始化方法

Python:在类中初始化方法,python,class,tkinter,init,Python,Class,Tkinter,Init,我创建了一个简单的程序,在屏幕上显示28个数字。目前,当你点击数字时,什么也没有发生。最终,我希望这些数字在点击后消失。此外,当你点击“5”时,你会得到5分。我想让这个多人游戏在10秒后积分最多的用户获胜。但这些都是以后的事了 我的代码是: from Tkinter import * import random class Game(Frame): def __init__(self, parent): Frame.__init__(self, parent, bac

我创建了一个简单的程序,在屏幕上显示28个数字。目前,当你点击数字时,什么也没有发生。最终,我希望这些数字在点击后消失。此外,当你点击“5”时,你会得到5分。我想让这个多人游戏在10秒后积分最多的用户获胜。但这些都是以后的事了

我的代码是:

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()添加到构造函数中,将main(self)放在类游戏中,并删除了“if name='main'部分。但是当我运行程序时,什么都没有发生。有人有建议吗


谢谢

此链接将帮助您:

它解释了如何使用
python
TkInter
wxPython
正确构建GUI,并将准确地回答您的问题


简言之,最好让您的类从Tkinter.Tk继承,并在
if\uuuuu name\uuuuu==“\uuuu main”下启动主循环__“:
测试。

是你的问题~如何组织代码?简而言之,这是我的问题。但这还不止于此。有人能帮上忙吗?顶级代码中的全局语句,正如你们所做的,并没有任何效果。我建议您删除它们,因为它们只是额外的噪音。如果(但仅当)重新绑定函数中的名称时,才需要函数中的全局语句,如add_number_to_screen。现在看一下我的代码。我改变了很多,改进了代码。但另一个问题仍然存在。请让我知道,如果你能帮助我做了,但还有一些问题。你能帮忙吗?解释一下问题,我们拭目以待。