如何在 tkinter python 中获取放置在网格中的小部件的行号和列号?
How To Get the row and column number for a widget placed in grid in tkinter python?
我在网格中放置了多个组合框,如下所示。
这些组合框存储在具有相应行、列的数组中,例如如下所示。
self.c_arr[row,column] = ttk.Combobox(what_ev,
textvariable=self.c_it_val[row,column],
values=list(self.c_list[row,column].keys()))
self.c_arr[row,column].bind("<<ComboboxSelected>>", lambda
x:self.c_capture(what_ev, <Want to pass row, column information as well>))
每当绑定到组合框的函数是 called/triggered 时,我想将相应的行、列号与其他变量一起传递给被调用的函数。
如何get/retrieve将各自的widgets行,列number/location详情放置在网格上?
更新:添加下面的示例代码。
- 下面的代码创建了一个 3x3 组合框并绑定了一个函数,以便在选择任何相应的组合框时调用该函数。当被选中时,我想获取在该框中选择的值并打印它。
示例代码:
import Tkinter
from Tkinter import *
from Tkinter import Tk, StringVar
import ttk
import tkFont
class Application:
def __init__(self, parent):
self.parent = parent
self.sco1 = None
self.c_int_val = StringVar()
self.box = {}
self.box_value = {}
self.box_int_list = {}
self.combo()
def combo(self):
for row in range (3):
for column in range(3):
self.box_int_list[row,column] = {key: None for key in range(1,10)}
self.box_value[row,column] = StringVar()
self.box_value[row,column].set("0")
self.box[row,column] = ttk.Combobox(self.parent, textvariable=self.box_value[row,column], values = list(self.box_int_list[row,column].keys()), state='readonly', width=39)
self.box[row,column].bind("<<ComboboxSelected>>", lambda x:self.print_selected_value("Eurekaa", len(self.box_int_list[row,column])))
self.box[row,column].grid(row=row, column=column)
def print_selected_value(self, what_name, list_len, *args):
print "Value selected is: %s"%(self.box[row,column].get())
print what_name
print list_len
if __name__ == '__main__':
root = Tk()
app = Application(root)
root.mainloop()
但是由于我无法获取行、列信息,因此无法从选定的组合框中获取值。怎么办?
如果将事件传递给回调,则可以在与事件关联的小部件上使用 grid_info
。
def callback(event, row, column):
print(row, column)
cb.bind("<<ComboboxSelected>>", callback)
如果您想传递信息,没有什么可以阻止您使用 lambda
或 functools.partial
:
c.bind("<<ComboboxSelected>>",
lambda event, row=row, column=column: callback(event, row, column))
我在网格中放置了多个组合框,如下所示。
这些组合框存储在具有相应行、列的数组中,例如如下所示。
self.c_arr[row,column] = ttk.Combobox(what_ev,
textvariable=self.c_it_val[row,column],
values=list(self.c_list[row,column].keys()))
self.c_arr[row,column].bind("<<ComboboxSelected>>", lambda
x:self.c_capture(what_ev, <Want to pass row, column information as well>))
每当绑定到组合框的函数是 called/triggered 时,我想将相应的行、列号与其他变量一起传递给被调用的函数。
如何get/retrieve将各自的widgets行,列number/location详情放置在网格上?
更新:添加下面的示例代码。
- 下面的代码创建了一个 3x3 组合框并绑定了一个函数,以便在选择任何相应的组合框时调用该函数。当被选中时,我想获取在该框中选择的值并打印它。
示例代码:
import Tkinter
from Tkinter import *
from Tkinter import Tk, StringVar
import ttk
import tkFont
class Application:
def __init__(self, parent):
self.parent = parent
self.sco1 = None
self.c_int_val = StringVar()
self.box = {}
self.box_value = {}
self.box_int_list = {}
self.combo()
def combo(self):
for row in range (3):
for column in range(3):
self.box_int_list[row,column] = {key: None for key in range(1,10)}
self.box_value[row,column] = StringVar()
self.box_value[row,column].set("0")
self.box[row,column] = ttk.Combobox(self.parent, textvariable=self.box_value[row,column], values = list(self.box_int_list[row,column].keys()), state='readonly', width=39)
self.box[row,column].bind("<<ComboboxSelected>>", lambda x:self.print_selected_value("Eurekaa", len(self.box_int_list[row,column])))
self.box[row,column].grid(row=row, column=column)
def print_selected_value(self, what_name, list_len, *args):
print "Value selected is: %s"%(self.box[row,column].get())
print what_name
print list_len
if __name__ == '__main__':
root = Tk()
app = Application(root)
root.mainloop()
但是由于我无法获取行、列信息,因此无法从选定的组合框中获取值。怎么办?
如果将事件传递给回调,则可以在与事件关联的小部件上使用 grid_info
。
def callback(event, row, column):
print(row, column)
cb.bind("<<ComboboxSelected>>", callback)
如果您想传递信息,没有什么可以阻止您使用 lambda
或 functools.partial
:
c.bind("<<ComboboxSelected>>",
lambda event, row=row, column=column: callback(event, row, column))