【问题标题】:get value from entry to be inside frame从条目中获取值在框架内
【发布时间】:2020-08-15 12:15:20
【问题描述】:

我有自动生成的帧。这些框架包含标签等对象,并且只有 1 个条目。 我设法使用以下命令识别条目:

          for widget in FrameCalc.winfo_children():
             print("widget.winfo_children()[4]", widget.winfo_children()[4])

这给了我这个

          .! toplevel.labels.! frame2.! entry

如何获取目标条目中包含的值? 提前感谢您的宝贵时间

【问题讨论】:

  • 请不要发送垃圾邮件。不管这是什么,都不是java
  • css 都不是。请详细说明并在 jsfiddle 或类似的东西上举一个例子。
  • 您直接使用winfo_children[4] 访问条目时,for 循环的意义何在?
  • 看起来 dis 是 python 和 tkinter,试着说 entryname.get() 来获取你的条目小部件里面的内容
  • PYthon Tkinter(对不起)-我找到了这个解决方案 Qt_HV_cible = widget.winfo_children()[4].get()

标签: python tkinter


【解决方案1】:

欢迎来到 Stack Overflow 社区!

在您的情况下,您可以根据您的要求使用SrtingVar()(holing string)、IntVar()(holing integer)、DoubleVar()(holding float)或BooleanVar()(holding boolean values)中的任何一个并分配textvariableentry 小部件。然后,您可以将这些变量附加到列表中,并在需要时使用.get() 方法检索其内容。下面是一个示例,使用循环创建许多带有StringVar() 的条目并稍后获取它们的值。

from tkinter import *

root = Tk()

def display(ent):
    global disp, var_list
    disp.set(var_list[ent].get())

var_list = []
for i in range (0, 5):
    var = StringVar()
    entry = Entry(root, textvariable = var)
    var_list.append(var)
    entry.pack()
    button = Button(root, text = "Show", command =  lambda ent = i: display(ent))
    button.pack()
    
disp = StringVar()
label = Label(root, textvariable = disp)
label.pack()

root.mainloop()

【讨论】:

  • 感谢您的回答。我知道这个过程。这不是我的问题的答案!
【解决方案2】:

我相信这就是您正在寻找的答案。

  • 使用isinstance() 检查小部件类型
  • 使用get()返回值

import tkinter as tk


#a dummy widget for example purposes
class DummyWidget(tk.Frame):
    def __init__(self, master, t, e, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        
        tk.Label(self, text=t).grid(row=0, column=0)
        ent = tk.Entry(self)
        ent.grid(row=0, column=1)
        ent.insert(0, e)
    

#extend root
class App(tk.Tk):
    #application constants
    TITLE = 'Application'
    WIDTH, HEIGHT, X, Y = 800, 600, 50, 50

    def __init__(self):
        tk.Tk.__init__(self)
        
        DummyWidget(self, "label 1", "entry 1").grid(row=0, column=0)
        DummyWidget(self, "label 2", "entry 2").grid(row=1, column=0)
        DummyWidget(self, "label 3", "entry 3").grid(row=2, column=0)
        
        #this is the answer portion of the example
        for widget in self.winfo_children():
            for i, subwidget in enumerate(widget.winfo_children()):
                if isinstance(subwidget, tk.Entry):
                    print(f'child {i} of widget', subwidget.get())


#properly initialize your app
if __name__ == '__main__':
    app = App()
    app.title(App.TITLE)
    app.geometry(f'{App.WIDTH}x{App.HEIGHT}+{App.X}+{App.Y}')
    #app.resizable(width=False, height=False)
    app.mainloop()

这个概念也可以变成一个实用程序,这样你就有了一个动态的系统,可以从你想要的任何地方开始寻找你想要的任何东西。每次您需要查找特定的实例类型时,我肯定会认为这比重写上述多维循环(在孙子节点处停止)更可取。

import tkinter as tk
from dataclasses import dataclass
from typing import Type


#a dummy widget for example purposes
class DummyWidget(tk.Frame):
    def __init__(self, master, t, e, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        
        tk.Label(self, text=t).grid(row=0, column=0)
        ent = tk.Entry(self)
        ent.grid(row=0, column=1)
        ent.insert(0, e)
        
 
#to illustrate inheritance        
class DummyEntry(tk.Entry):
    def __init__(self, master, text, **kwargs):
        tk.Entry.__init__(self, master, **kwargs)
        self.insert(0, text)
   
 
#used in Utils.GetInstancesAsDataFrom(...) to store individual widget data
@dataclass
class WidgetData_dc:
    type:       Type
    parent:     tk.Widget
    childindex: int
    path:       str
    

class Utils:
    """ GetInstancesFrom
    deep search of every child, grandchild, etc.. for a specific widget type
    @start ~ parent widget to start the search from
    @wtype ~ the type of widget to find
    @inst  ~ used internally to pass the dictionary to this method's internal calls of itself
    returns a dictionary of all found instances 
    """
    @staticmethod
    def GetInstancesFrom(start, wtype, inst=None):
        instances = dict() if inst is None else inst
        for widget in start.winfo_children():
            if isinstance(widget, wtype):
                instances[f'{widget}'] = widget
            Utils.GetInstancesFrom(widget, wtype, instances)

        return instances
        
    """ GetInstancesAsDataFrom
    deep search of every child, grandchild, etc.. for a specific widget type
    @start ~ parent widget to start the search from
    @wtype ~ the type of widget to find
    @inst  ~ used internally to pass the dictionary to this method's internal calls of itself
    returns a dictionary of all found instances 
    """
    @staticmethod
    def GetInstancesAsDataFrom(start, wtype, inst=None):
        instances = dict() if inst is None else inst
        for i, widget in enumerate(start.winfo_children()):
            if isinstance(widget, wtype):
                instances[widget] = WidgetData_dc(type(widget), start, i, f'{widget}')
            Utils.GetInstancesAsDataFrom(widget, wtype, instances)

        return instances                  


#extend root
class App(tk.Tk):
    #application constants
    TITLE = 'Application'
    WIDTH, HEIGHT, X, Y = 800, 600, 50, 50

    def __init__(self):
        tk.Tk.__init__(self)
        
        #a bunch of junk instances for example purposes
        DummyWidget(self, "label 1", "entry 1").grid(column=0)
        DummyWidget(self, "label 2", "entry 2").grid(column=0)
        DummyWidget(self, "label 3", "entry 3").grid(column=0)
        DummyEntry(self, text='entry 4').grid(column=0) #this extends tk.Entry so it qualifies as a tk.Entry
        
        #answer portion of the example
        for path, widget in Utils.GetInstancesFrom(self, tk.Entry).items():
            print(f'{path}: {widget.get()}')
            
        print('') #skip a line
            
        #alternate implementation
        for widget, data in Utils.GetInstancesAsDataFrom(self, tk.Entry).items():
            print(f'{data.parent}[{data.childindex}]:{data.type} has value "{widget.get()}"')


#properly initialize your app
if __name__ == '__main__':
    app = App()
    app.title(App.TITLE)
    app.geometry(f'{App.WIDTH}x{App.HEIGHT}+{App.X}+{App.Y}')
    #app.resizable(width=False, height=False)
    app.mainloop()

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多