【问题标题】:How To Get the row and column number for a widget placed in grid in tkinter python?如何获取放置在 tkinter python 网格中的小部件的行号和列号?
【发布时间】:2020-03-12 21:15:57
【问题描述】:

如下图所示,我在网格中放置了多个 Combobox。

这些组合框与相应的行、列存储在数组中,例如如下所示。

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>))

每当绑定到组合框的函数被调用/触发时,我想将相应的行、列号与其他变量一起传递给被调用的函数。

如何获取/检索放置在网格上的相应小部件行、列号/位置详细信息?

更新:添加下面的示例代码。

  1. 下面的代码创建了一个 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()

但由于我无法获取行、列信息,因此无法从选定的组合框中获取值。怎么办?

【问题讨论】:

  • @TkinterPythonFans:关于如何获取该信息的任何想法或 cmets ?小部件是否提供了一些可以检索行、列信息的内部函数。如果没有其他解决方法,如何将这些信息传递给触发的绑定函数?

标签: python-2.7 tkinter combobox


【解决方案1】:

如果您将事件传递给回调,则可以在与事件关联的小部件上使用grid_info

def callback(event, row, column):
    print(row, column)

cb.bind("<<ComboboxSelected>>", callback)

如果你想传递信息,没有什么可以阻止你使用lambdafunctools.partial

c.bind("<<ComboboxSelected>>", 
       lambda event, row=row, column=column: callback(event, row, column))

【讨论】:

  • 非常感谢您的评论/澄清,这真的很有帮助!
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多