Tkinter:框架中的按钮不可见
Tkinter : Button in frame not visible
我正在尝试实现一个 TicTacToe 程序。我是 python 的绝对初学者。看了很多教程,看了几本书,基本了解了Python。我试图让按钮显示在一个框架中,但我得到的只是一个空白 window.
link for image of the resultant window
这是我目前的代码:
from Tkinter import *
class Buttons(object):
def __init__(self,master):
frame = Frame(master)
frame.pack()
self.button1= Button(frame,text="1",height=4,width=8,command=self.move)
self.button1.pack(side=LEFT)
self.button2= Button(frame,text="2",height=4,width=8,command=self.move)
self.button2.pack(side=LEFT)
self.button3= Button(frame,text="3",height=4,width=8,command=self.move)
self.button3.pack(side=LEFT)
root = Tk()
root=mainloop()
好的,问题是我需要在代码末尾添加一个变量。像 b=Buttons(root) 这样的东西。现在可以使用了。
您定义了 Buttons
class,但没有创建 class 的实例,因此实际上没有构建任何按钮。另外,您有错字/语法错误:
root=mainloop()
应该是
root.mainloop()
此外,您没有定义 move
回调方法。
这是您的代码的修复版本:
from Tkinter import *
class Buttons(object):
def __init__(self,master):
frame = Frame(master)
frame.pack()
self.button1 = Button(frame, text="1", height=4, width=8, command=self.move)
self.button1.pack(side=LEFT)
self.button2 = Button(frame, text="2", height=4, width=8, command=self.move)
self.button2.pack(side=LEFT)
self.button3 = Button(frame, text="3", height=4, width=8, command=self.move)
self.button3.pack(side=LEFT)
def move(self):
print "click!"
root = Tk()
Buttons(root)
root.mainloop()
但是,这仍然有一个问题:move
方法无法知道哪个按钮调用了它。这是解决该问题的一种方法。我也改了
from Tkinter import *
到
import tkinter as tk
使用 "star" 导入不是一个好主意。它们使代码更难阅读,并且用导入模块中定义的所有名称(在 Tkinter 中有 175 个名称)污染您的命名空间,这可能导致名称冲突。
import Tkinter as tk
class Buttons(object):
def __init__(self,master):
frame = tk.Frame(master)
frame.pack()
self.buttons = []
for i in range(1, 4):
button = tk.Button(
frame, text=i, height=4, width=8,
command=lambda n=i:self.move(n)
)
button.pack(side=tk.LEFT)
self.buttons.append(button)
def move(self, n):
print "click", n
root = tk.Tk()
Buttons(root)
root.mainloop()
我正在尝试实现一个 TicTacToe 程序。我是 python 的绝对初学者。看了很多教程,看了几本书,基本了解了Python。我试图让按钮显示在一个框架中,但我得到的只是一个空白 window.
link for image of the resultant window
这是我目前的代码:
from Tkinter import *
class Buttons(object):
def __init__(self,master):
frame = Frame(master)
frame.pack()
self.button1= Button(frame,text="1",height=4,width=8,command=self.move)
self.button1.pack(side=LEFT)
self.button2= Button(frame,text="2",height=4,width=8,command=self.move)
self.button2.pack(side=LEFT)
self.button3= Button(frame,text="3",height=4,width=8,command=self.move)
self.button3.pack(side=LEFT)
root = Tk()
root=mainloop()
好的,问题是我需要在代码末尾添加一个变量。像 b=Buttons(root) 这样的东西。现在可以使用了。
您定义了 Buttons
class,但没有创建 class 的实例,因此实际上没有构建任何按钮。另外,您有错字/语法错误:
root=mainloop()
应该是
root.mainloop()
此外,您没有定义 move
回调方法。
这是您的代码的修复版本:
from Tkinter import *
class Buttons(object):
def __init__(self,master):
frame = Frame(master)
frame.pack()
self.button1 = Button(frame, text="1", height=4, width=8, command=self.move)
self.button1.pack(side=LEFT)
self.button2 = Button(frame, text="2", height=4, width=8, command=self.move)
self.button2.pack(side=LEFT)
self.button3 = Button(frame, text="3", height=4, width=8, command=self.move)
self.button3.pack(side=LEFT)
def move(self):
print "click!"
root = Tk()
Buttons(root)
root.mainloop()
但是,这仍然有一个问题:move
方法无法知道哪个按钮调用了它。这是解决该问题的一种方法。我也改了
from Tkinter import *
到
import tkinter as tk
使用 "star" 导入不是一个好主意。它们使代码更难阅读,并且用导入模块中定义的所有名称(在 Tkinter 中有 175 个名称)污染您的命名空间,这可能导致名称冲突。
import Tkinter as tk
class Buttons(object):
def __init__(self,master):
frame = tk.Frame(master)
frame.pack()
self.buttons = []
for i in range(1, 4):
button = tk.Button(
frame, text=i, height=4, width=8,
command=lambda n=i:self.move(n)
)
button.pack(side=tk.LEFT)
self.buttons.append(button)
def move(self, n):
print "click", n
root = tk.Tk()
Buttons(root)
root.mainloop()