Python:在类中初始化方法
我创建了一个简单的程序,在屏幕上显示28个数字。目前,当你点击数字时,什么也没有发生。最终,我希望这些数字在点击后消失。此外,当你点击“5”时,你会得到5分。我想让这个多人游戏在10秒后积分最多的用户获胜。但这些都是以后的事了 我的代码是: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
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。现在看一下我的代码。我改变了很多,改进了代码。但另一个问题仍然存在。请让我知道,如果你能帮助我做了,但还有一些问题。你能帮忙吗?解释一下问题,我们拭目以待。