GUI - tkinter:如何访问特定按钮的参数?
GUI - tkinter : how to access parameters of specific buttons?
像许多其他 python 初学者一样,我正在使用 GUI (tkinter)。对于我的小项目,我想创建一个 5x5 按钮的网格,即总共 25 个按钮,并与它们交互:当您单击这 25 个按钮中的任何一个时,一些按钮会在单击的按钮周围发生变化。
我不会详细说明我想要的最终结果是什么,除非您认为它是相关的。您会在下面找到专门针对此问题改编的代码片段。
问题是:
在这种情况下,如何使某些特定按钮对按下另一个按钮的事件做出反应?
添加了有关这种情况的更多信息,我将这样表述我的问题:
给定由 for 循环生成的 25 个按钮的数组,如何定位特定按钮以便与其参数交互(例如:参数 'bg'。一个按钮被点击,另一个改变颜色),考虑到这些按钮没有存储到允许显式访问的变量中(例如:butt = tk.Button(...)。更改 butt 的参数很容易,因为小部件是显式分配的到一个变量。这里,没有变量赋值,只是小部件的迭代创建)
找了很久都没有找到答案,肯定是找错了方向
如果您 运行 下面的代码,您将得到一个 5x5 的按钮网格。我想要的是,例如,如果我单击任何按钮,所有周围的按钮都会将它们的背景颜色更改为绿色。
import tkinter as tk
# --- functions ---
def draw_board():
frame_board = tk.Frame(root)
frame_board.pack()
def callback(button):
button['relief'] = 'sunken'
button['bg'] = 'lightgrey'
button['state'] = 'disabled'
def draw_tile(container, number):
tile_1 = tk.Button(container,
text='1',
width=6,
height=3,
relief='sunken',
bg='lightgrey',
state='disabled')
tiles = tk.Button(container,
text='?',
command=lambda: callback(tiles),
width=6,
height=3)
if number == 1:
return tile_1
else:
return tiles
r, c = 0, 0
for i in range(1,26):
c += 1
if i in range(1,26,5):
r += 1
c = 0
draw_tile(frame_board, i).grid(row=r,
column=c,
sticky='wens',
padx=10,
pady=10)
else:
draw_tile(frame_board, i).grid(row=r,
column=c,
sticky='wens',
padx=10,
pady=10)
# --- main ---
root = tk.Tk()
root.geometry('400x400')
start_button = tk.Button(root,
text='START',
command=draw_board)
start_button.place(relx=.5,
rely=.5,
anchor='center')
root.mainloop()
这是我关于 SO 的第一个问题,所以请告诉我它是否不完整,或者是否需要更精确。我试图让代码比我正在处理的代码更轻,但如果需要我可以让它更简单(我认为)
谢谢!
编辑:如果您在我的代码中看到任何为了 clarity/effectiveness/usage 等而应该修改的内容,请告诉我,即使它没有回答我的棘手问题。
几年前刚开始的时候,我实际上问过一个类似的问题:
如果在创建按钮时将它们存储在某个地方会容易得多:
(我也删除了一些冗余代码。)
import tkinter as tk
# --- functions ---
def draw_board(buttons):
frame_board = tk.Frame(root)
frame_board.pack()
def surround(buttons, num):
edges = {'N': list(range(0,5)), 'E': list(range(4,25,5)),
'S': list(range(20,25)), 'W': list(range(0,25,5))}
encircle = {'N':-5, 'NE':-4, 'E':1, 'SE':6, 'S':5, 'SW':4, 'W':-1, 'NW':-6}
for direction in edges:
# determine if selected button is on an edge
if num in edges[direction]:
# if button is on an edge, set encircle direction False
for d in encircle:
if direction in d:
encircle[d] = False
for key, val in encircle.items():
if val: # check that its not False
buttons[num + val].config(bg = 'green')
def callback(buttons, num):
buttons[num].config(relief = 'sunken', bg = 'lightgrey', state = 'disabled')
surround(buttons, num)
def draw_tile(container, buttons, number):
tile = tk.Button(container, text='?', width=6, height=3,
command=lambda num=number: callback(buttons, num))
return tile
r, c = 0, 0
for i in range(0,25):
c += 1
buttons.append(draw_tile(frame_board, buttons, i)) # append button
if i in range(0,25,5):
r += 1
c = 0
# grid last button in list
buttons[-1].grid(row=r, column=c, sticky='wens', padx=10, pady=10)
# --- main ---
root = tk.Tk()
root.geometry('400x400')
buttons = [] # declare list
start_button = tk.Button(root, text='START',
command=lambda:draw_board(buttons))
start_button.place(relx=.5, rely=.5, anchor='center')
root.mainloop()
现在 buttons
是一个包含每个按钮的列表,您可以使用 buttons[0].config()
方法编辑它们的属性
像许多其他 python 初学者一样,我正在使用 GUI (tkinter)。对于我的小项目,我想创建一个 5x5 按钮的网格,即总共 25 个按钮,并与它们交互:当您单击这 25 个按钮中的任何一个时,一些按钮会在单击的按钮周围发生变化。 我不会详细说明我想要的最终结果是什么,除非您认为它是相关的。您会在下面找到专门针对此问题改编的代码片段。
问题是:
在这种情况下,如何使某些特定按钮对按下另一个按钮的事件做出反应?
添加了有关这种情况的更多信息,我将这样表述我的问题:
给定由 for 循环生成的 25 个按钮的数组,如何定位特定按钮以便与其参数交互(例如:参数 'bg'。一个按钮被点击,另一个改变颜色),考虑到这些按钮没有存储到允许显式访问的变量中(例如:butt = tk.Button(...)。更改 butt 的参数很容易,因为小部件是显式分配的到一个变量。这里,没有变量赋值,只是小部件的迭代创建)
找了很久都没有找到答案,肯定是找错了方向
如果您 运行 下面的代码,您将得到一个 5x5 的按钮网格。我想要的是,例如,如果我单击任何按钮,所有周围的按钮都会将它们的背景颜色更改为绿色。
import tkinter as tk
# --- functions ---
def draw_board():
frame_board = tk.Frame(root)
frame_board.pack()
def callback(button):
button['relief'] = 'sunken'
button['bg'] = 'lightgrey'
button['state'] = 'disabled'
def draw_tile(container, number):
tile_1 = tk.Button(container,
text='1',
width=6,
height=3,
relief='sunken',
bg='lightgrey',
state='disabled')
tiles = tk.Button(container,
text='?',
command=lambda: callback(tiles),
width=6,
height=3)
if number == 1:
return tile_1
else:
return tiles
r, c = 0, 0
for i in range(1,26):
c += 1
if i in range(1,26,5):
r += 1
c = 0
draw_tile(frame_board, i).grid(row=r,
column=c,
sticky='wens',
padx=10,
pady=10)
else:
draw_tile(frame_board, i).grid(row=r,
column=c,
sticky='wens',
padx=10,
pady=10)
# --- main ---
root = tk.Tk()
root.geometry('400x400')
start_button = tk.Button(root,
text='START',
command=draw_board)
start_button.place(relx=.5,
rely=.5,
anchor='center')
root.mainloop()
这是我关于 SO 的第一个问题,所以请告诉我它是否不完整,或者是否需要更精确。我试图让代码比我正在处理的代码更轻,但如果需要我可以让它更简单(我认为)
谢谢!
编辑:如果您在我的代码中看到任何为了 clarity/effectiveness/usage 等而应该修改的内容,请告诉我,即使它没有回答我的棘手问题。
几年前刚开始的时候,我实际上问过一个类似的问题:
如果在创建按钮时将它们存储在某个地方会容易得多:
(我也删除了一些冗余代码。)
import tkinter as tk
# --- functions ---
def draw_board(buttons):
frame_board = tk.Frame(root)
frame_board.pack()
def surround(buttons, num):
edges = {'N': list(range(0,5)), 'E': list(range(4,25,5)),
'S': list(range(20,25)), 'W': list(range(0,25,5))}
encircle = {'N':-5, 'NE':-4, 'E':1, 'SE':6, 'S':5, 'SW':4, 'W':-1, 'NW':-6}
for direction in edges:
# determine if selected button is on an edge
if num in edges[direction]:
# if button is on an edge, set encircle direction False
for d in encircle:
if direction in d:
encircle[d] = False
for key, val in encircle.items():
if val: # check that its not False
buttons[num + val].config(bg = 'green')
def callback(buttons, num):
buttons[num].config(relief = 'sunken', bg = 'lightgrey', state = 'disabled')
surround(buttons, num)
def draw_tile(container, buttons, number):
tile = tk.Button(container, text='?', width=6, height=3,
command=lambda num=number: callback(buttons, num))
return tile
r, c = 0, 0
for i in range(0,25):
c += 1
buttons.append(draw_tile(frame_board, buttons, i)) # append button
if i in range(0,25,5):
r += 1
c = 0
# grid last button in list
buttons[-1].grid(row=r, column=c, sticky='wens', padx=10, pady=10)
# --- main ---
root = tk.Tk()
root.geometry('400x400')
buttons = [] # declare list
start_button = tk.Button(root, text='START',
command=lambda:draw_board(buttons))
start_button.place(relx=.5, rely=.5, anchor='center')
root.mainloop()
现在 buttons
是一个包含每个按钮的列表,您可以使用 buttons[0].config()
方法编辑它们的属性