2016-06-21 45 views
0

我想我的“退出”按钮关闭窗口,并结束程序,无论它被按下。现在它首先被按下,但如果首先按下“滚动”按钮,那么“退出”按钮不会关闭窗口。我是一名初学者程序员,所以我确信我的代码中存在不相关的问题,但是如果您能帮助我解决这个特定问题,请提前致谢!Python Tkinter - 退出按钮不工作,如果其他按钮先点击

from Tkinter import * 
from random import randint 

class Application(Frame): 

def displayBoard(self): 
    self.canvas1 = Canvas(self, width=200, height=200) 
    self.canvas1.pack() 
    self.canvas2 = Canvas(self, width=200, height=200) 
    self.canvas2.pack() 

    self.roll_button = Button(self, text="Roll the Dice", command=self.roll) 
    self.roll_button.pack() 

    self.clear = Button(self, text="Clear", command=self.resetBoard) 
    self.clear.pack() 

    self.quit = Button(self, text="Quit", command=self.quit) 
    self.quit.pack() 


def __init__(self, master=None): 
    Frame.__init__(self, master) 
    Pack.config(self) 


def roll(self): 
    die1 = faces[(randint(1,6)-1)] 
    die2 = faces[(randint(1,6)-1)] 
    self.resetBoard() 
    self.canvas1.create_text(20, 30, anchor=W, text=die1) 
    self.canvas1.pack() 

    self.canvas2.create_text(20, 30, anchor=W, text=die2) 
    self.canvas2.pack() 


def resetBoard(self): 
    self.canvas1.destroy() 
    self.canvas2.destroy() 
    self.clear.destroy() 
    self.roll_button.destroy() 
    self.quit.destroy() 
    self.displayBoard() 

def quit(self): 
    self.master.quit() 
    self.master.destroy() 

master = Tk() 


    face1 = """\n 
__________ 
|     | 
|     | 
|  ()  | 
|     | 
|__________| 
""" 

face2 = """\n 
__________ 
|     | 
|   ()  | 
|     | 
| ()   | 
|__________| 
""" 
face3 = """ \n 
__________ 
|     | 
|   () | 
|  ()  | 
| ()   | 
|__________| 
""" 


face4 = """\n 
__________ 
|     | 
| () ()  | 
|     | 
| () ()  | 
|__________| 
""" 

face5 = """ \n 
__________ 
|     | 
| () () | 
|  ()  | 
| () () | 
|__________| 
""" 

face6 = """ \n 
__________ 
|     | 
| () () | 
| () () | 
| () () | 
|__________| 
""" 

faces = [face1, face2, face3, face4, face5, face6] 

dicegame = Application() 
dicegame.displayBoard() 
dicegame.mainloop() 
+0

尝试重命名你的'退出()'函数;当你尝试重新设置开发板时,可能会发现'self.quit'是一个'Button',并且正在调用该按钮作为它的动作。可能会抛出一个只是沉默或内容的内部死亡参考。 – Delioth

+0

@Delioth:这正是发生的事情。 'self.quit'在这段代码的不同时间意味着不同的事物。 –

回答

0

(对于后面这个问题的程序员谁在这里跌倒)

这个问题是你有功能self.quit按钮self.quit。 Python不会重载名称 - self.quit初始化后是一个函数,但在第一次调用self.resetBoard后,按钮self.quit关联 - 破坏了对函数的引用。

解决方法是重命名其中一个,并记住避免命名冲突。一些Python的方式包括:

  • 内部函数可以用领先被命名为下划线self._quit()
  • 避免发生命名空间冲突与内建命令(退出()是内置的)通常与尾部进行强调self.quit_()
  • 更具描述性的名称为您的按钮,即self.quit_button;或你的函数,即self.on_quit()self.quit_app()self.destroy()(注意,最后一个需要调用super()。destroy()方法里面的某个地方,否则你会打破的东西)
+0

非常感谢!解决了它。非常感激。 –