【问题标题】:Tkinter Button loop - How to create a loop with multiple buttons?Tkinter 按钮循环 - 如何创建具有多个按钮的循环?
【发布时间】:2020-09-26 16:20:02
【问题描述】:

正如您在我的代码中看到的那样,我正在创建应该与黑白交替的按钮。但是,如果用户单击这些按钮之一,则应输出相应的坐标。我的目标是输出一个 8x8 的字段,其中每个字段或按钮的颜色从黑到白交替变化(就像棋盘一样),您可以查询每个字段的坐标。我已经尝试了一些 for 循环的尝试,但没有成功。因为我不想创建 64 个不同的按钮,所以必须有某种方法来循环它。有人可以给我一些关于如何解决这个问题的提示或建议吗?

这是我的代码:

from tkinter import *

import tkinter as tk
window = Tk()
window.geometry('600x600')

def btn_1(event):
    print("00")

button1 = Button(window, width=10, height=4, bg='black')
button1.grid(row=0, column=0)
button1.bind("<Button-1>", btn_1)

def btn_2(event):
    print("01")

button2 = Button(window, width=10, height=4, bg='white')
button2.grid(row=0, column=1)
button2.bind("<Button-1>", btn_2)


window.mainloop()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:
    def coordinates(x,y):
        print(x,y)
    
    for i in range(8):
        if i%2==0:
            
            for k in range(8):
                if k%2 ==0:
                    tk.Button(root,bg="black",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
                else:
                    tk.Button(root,bg="white",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
        else:
            for k in range(8):
                if k%2 ==0:
                    tk.Button(root,bg="white",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
                else:
                    tk.Button(root,bg="black",command=lambda x=i,y=k: coordinates(x,y)).grid(row=i,column=k)
    

    此代码块创建一个类似 8x8 棋盘的字段。您可以指定按钮参数。我只指定了颜色,因为它是一个例子。

    【讨论】:

    • 这个看起来不错。但是你知道,我如何协调按钮吗?例如 00、01、...
    • 为什么需要“协调”它们?用户点击按钮时知道点击了哪个按钮的原因是什么?
    • 我的老师给了我任务,我需要协调这些按钮。用户每次按下这些按钮之一时,他应该知道该按钮的位置。这意味着,如果我按下第 4 行/第 3 列中的按钮,例如,它应该包含“32”作为答案。
    • 我编辑了我的答案。现在,它可以满足您的需求。
    • 非常感谢!我爱你,你是最棒的!但是你能解释一下这些 for 循环是如何工作的吗?
    【解决方案2】:

    在绑定按钮时添加一个 lambda 作为函数。

    例如:

    def click(x, y):
        print(str(x) + str(y))
    
    for x in range(8):
        for y in range(8):
            if ((x+1) * (y+1)) % 2 == 0:
                button = tk.Button(root, bg='white').grid(row=x, column=y)
            else:
                button = tk.Button(root, bg='white').grid(row=x, column=y)
            
            button.bind('<Button-1>', lambda x=x, y=y: click(x, y))
    

    点击函数将被调用,按钮的坐标将作为 x 和 y 参数传递。

    【讨论】:

      【解决方案3】:

      您可以使用相对简单的数学运算来计算所需的值来完成您需要的事情(以及内置的divmod() 函数,使其稍微快一点)。这还允许通过避免在尽可能多的地方硬编码数值来使代码更加“数据驱动”。

      import tkinter as tk
      
      window = tk.Tk()
      window.geometry('600x600')
      
      WIDTH, HEIGHT = 8, 8
      GRID_SIZE = WIDTH * HEIGHT
      COLORS = 'black', 'white'
      
      def callback(row, col):
          print(f'{row}{col}')
      
      for i in range(GRID_SIZE):
          row, col = divmod(i, WIDTH)
          offset = row % 2
          color = COLORS[(i+offset) % 2]
          btn = tk.Button(window, width=10, height=4, bg=color,
                          command=lambda row=row, col=col: callback(row, col))
          btn.grid(row=row, column=col)
      
      window.mainloop()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        相关资源
        最近更新 更多