【发布时间】:2016-08-25 06:39:19
【问题描述】:
尝试创建一个创建 64 个按钮的方法。此方法会将按钮附加到二维列表并使用 .grid() 将它们放在 tkinter 画布上。不完全确定问题是什么。运行代码时,它实际上什么都不做,没有错误,没有代码 0,甚至没有出现 tkinter 窗口。该方法及其类的其余部分在下面。我也发了大师班,有什么帮助。
import Tkinter as Tk
import ttk
# Fonts used throughout the class
LARGE_FONT = ("Verdana", 14)
SMALL_FONT = ("Verdana", 10)
# Game Board
board = [['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
['R', 'N', 'B', 'K', 'Q', 'B', 'N', 'R']
]
class Board(Tk.Frame):
def __init__(self, parent, controller):
Tk.Frame.__init__(self, parent)
# init variables
self.turn = True
self.buttons = []
self.board = board
# Header
label = Tk.Label(self, text="Chess", font=LARGE_FONT)
label.pack(pady=10, padx=10)
# Game
# Sets game board
self.set_buttons()
# Sets game board
# self.set_buttons2()
back_button = ttk.Button(self, text="Main Menu", command=self.main_menu(controller))
back_button.pack(side=Tk.BOTTOM, fill=Tk.BOTH)
# Stores buttons in list for later use
# Places buttons on canvas.
def set_buttons(self):
for i in range(8):
self.buttons.append([])
for j in range(8):
self.buttons[i].append(ttk.Button(self, text=self.board[i][j]))
self.buttons[i][j].configure(command=self.piece_control)
self.buttons[i][j].grid(row=i, column=j, sticky="nsew")
def piece_control(self):
pass
@staticmethod
def main_menu(controller):
from MainMenu import MainMenu
return lambda: controller.show_frame(MainMenu)
我还会添加大师班,以防万一出现问题。
from MainMenu import MainMenu
from Board import Board
from Rules import Rules
from Options import Options
import Tkinter as Tk
class Main(Tk.Tk):
def __init__(self, *args, **kwargs):
Tk.Tk.__init__(self, *args, **kwargs)
Tk.Tk.title(self, "Chess")
container = Tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (MainMenu, Board, Options, Rules):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(MainMenu)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
# Creates Object of main and loops it.
Application = Main()
Application.geometry("650x650")
Application.mainloop()
【问题讨论】:
-
当你说代码“什么都不做”时,你的意思是按钮没有被创建,或者点击它们不起作用?如果是后者,
self.piece_control做什么?它是否期望得到一个参数,例如您在lambda中设置为默认值的i值(这是一个很好的代码,解决了在循环中创建闭包的问题,但是因为你没有'以后不要使用i)。 -
打印 self.buttons 以确保它是您想要的,使用较小的数字,任何大于 8 的数字,因此您有 2+ 行。在不知道如何实例化 Tk() 的情况下不能说更多。
-
我刚刚看到 " 并使用 .grid()" 将它们放在 tkinter 画布上。您必须使用 grid() 将它们放入框架中并使用 canvas.create_window 将框架放入画布小部件 effbot.org/tkinterbook/canvas.htm canvas.create_window(100, 200, window=frm, anchor=tk.CENTER)
-
@Blckknght 抱歉应该再澄清一点,当我编译并运行应用程序时,窗口没有出现,就像它永远不会到达 mainloop() 方法调用。这仅在调用 set_buttons 方法时发生。到目前为止,该命令什么都不做,只是一个 pass 语句,所以是的,lambda 是愚蠢的。
标签: python python-2.7 python-3.x tkinter tkinter-canvas