如何解决从输入中获取价值,将其置于框架之内
我有自动生成的帧。这些框架包含诸如标签之类的对象,并且只有1个条目。 我设法使用以下命令来标识条目:
for widget in FrameCalc.winfo_children(): print("widget.winfo_children()[4]",widget.winfo_children()[4])
这给了我
.! toplevel.labels.! frame2.! entry
如何获取目标条目中包含的值? 预先感谢您的时间
解决方法
欢迎使用Stack Overflow社区!
根据您的情况,您可以使用SrtingVar()
(钻孔字符串),IntVar()
(钻孔整数),DoubleVar()
(保持浮点数)或BooleanVar()
(保持布尔值)中的任何一个值),并为textvariable
小部件分配entry
。然后,您可以将这些变量附加到列表中,并在需要时使用.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()
,
我相信这是您正在寻找的答案。
- 使用
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,**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,"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,e)
#to illustrate inheritance
class DummyEntry(tk.Entry):
def __init__(self,text,**kwargs):
tk.Entry.__init__(self,**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,instances)
return instances
""" GetInstancesAsDataFrom
deep search of every child,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,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,instances)
return instances
#extend root
class App(tk.Tk):
#application constants
TITLE = 'Application'
WIDTH,50
def __init__(self):
tk.Tk.__init__(self)
#a bunch of junk instances for example purposes
DummyWidget(self,"entry 1").grid(column=0)
DummyWidget(self,"entry 2").grid(column=0)
DummyWidget(self,"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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。