【问题标题】:Creating a 2D List To Store Tkinter Buttons创建一个 2D 列表来存储 Tkinter 按钮
【发布时间】: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


【解决方案1】:

它对我很有用,它确实在根上创建了一个 8x8 矩阵。

import ttk
from Tkinter import *
root = Tk()
buttons = []

def set_buttons():
    for i in range(8):
        buttons.append([])
        for j in range(8):[![enter image description here][1]][1]
            buttons[i].append(ttk.Button(text='3'))
            buttons[i][j].configure(command=com)
            buttons[i][j].grid(row=i, column=j, sticky="nsew")

def com():
    print 3

set_buttons()
root.mainloop()

如果您仍然遇到问题,那么可能是因为您的代码中的其他部分,所以请发布更广泛的代码块以便我们找到问题。

【讨论】:

  • 我将尝试添加更多代码,以便你们获得更好的视觉效果,但是还有很多其他类,很难找出可能是什么问题。我很高兴它至少为某人工作。请注意,该错误仅在调用该方法时发生。
【解决方案2】:

经过进一步调试,显然使用 .pack() 和 .grid() 被证明是相当混乱的。通过将 .pack() 方法更改为 .grid() 对 init 函数进行了一些简单的更改,它就像一个魅力。

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.grid(row=0, column=3, columnspan=2, sticky="nsew")

    # Game
    # Sets game board
    self.set_buttons()

    back_button = ttk.Button(self, text="Main Menu", command=self.main_menu(controller))
    back_button.grid(row=8, column=3, columnspan=2, sticky="nsew")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2014-06-02
    • 2021-04-05
    • 2023-04-03
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多