【问题标题】:Using tkinter Entries for variables in external functions将 tkinter 条目用于外部函数中的变量
【发布时间】:2015-12-11 14:17:19
【问题描述】:

我正在尝试将条目变量链接到 Tkinter 中的函数。我有 16 个条目/变量要在我的函数中使用。但是,我正在努力处理条目和变量分配之间的接口。

我的代码:

import Tkinter 
import pandas as pd
import numpy as np

class simulation_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        c2_low =Tkinter.StringVar()
        c3_low =Tkinter.StringVar()
        ic4_low =Tkinter.StringVar()
        nc4_low =Tkinter.StringVar()
        ic5_low =Tkinter.StringVar()
        nc5_low =Tkinter.StringVar()
        neoc5_low =Tkinter.StringVar()
        n2_low = Tkinter.StringVar()

        c2_high =Tkinter.StringVar()
        c3_high =Tkinter.StringVar()
        ic4_high =Tkinter.StringVar()
        nc4_high =Tkinter.StringVar()
        ic5_high =Tkinter.StringVar()
        nc5_high =Tkinter.StringVar()
        neoc5_high=Tkinter.StringVar()
        n2_high = Tkinter.StringVar()


        self.entry = Tkinter.Entry(self, textvariable = c2_low).grid(column=0,row=1,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = c2_high).grid(column=0,row=2,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = c3_low).grid(column=0,row=3,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = c3_high).grid(column=0,row=4,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = ic4_low).grid(column=1,row=1,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = ic4_high).grid(column=1,row=2,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = nc4_low).grid(column=1,row=3,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = nc4_high).grid(column=1,row=4,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = ic5_low).grid(column=0,row=5,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = ic5_high).grid(column=0,row=6,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = nc5_low).grid(column=0,row=7,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = nc5_high).grid(column=0,row=8,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = neoc5_low).grid(column=1,row=5,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = neoc5_high).grid(column=1,row=6,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = n2_low).grid(column=1,row=7,sticky='EW')
        self.entry = Tkinter.Entry(self, textvariable = n2_high).grid(column=1,row=8,sticky='EW')
        self.resizable(False,False)

        self.resizable(False,False)

        button = Tkinter.Button(self,text=u"simulate")
        button.bind("<Button-1>", simulation)
        button.grid(column=3,row=9)

    def simulation(self):

        #code for this not included but uses all 16 entries/variable

if __name__ == "__main__":
    app = simulation_tk(None)
    app.title('Simulation')
    app.mainloop()

我希望将我的条目的输入分配给一个变量,然后可以在单独的函数(模拟)中使用该变量

【问题讨论】:

  • 将每个 em 分配给自己。像 self.c_low、self.c2_high 等。这样这个类中的其他函数将用“self”继承它们
  • 如果您以不同的方式命名所有条目(self.entry1、self.entry2 等),您可能无论如何都不需要这些变量(ofc,您将需要移动 grid s 到另一条线)。可以通过调用self.entry1.get()获取Entry的内容
  • 通过 textvariable.get() 引用其文本变量,而不是条目本身,您可以从输入框中获取文本。
  • 你没有道理。您必须将 textvariable 分配给具有 Tkinter.StringVar() ... 的变量。但我似乎无法在单独的函数 simulation() 中使用此变量

标签: python pandas tkinter tkinter-canvas


【解决方案1】:

你可以通过调用它的“textvariable”来从一个盒子中取出值

c2_low.get()

因此,如果您将这些变量更改为 self.c2_low、self.c2_high 等,您将能够在模拟函数中调用它们,例如:

import Tkinter
import pandas as pd
import numpy as np

class simulation_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()
        self.grid()

    def initialize(self):
        self.c2_low =Tkinter.StringVar()
        self.entry = Tkinter.Entry(self, textvariable = self.c2_low).grid(column=0,row=1,sticky='EW')
        self.resizable(False,False)

        button = Tkinter.Button(self,text=u"simulate",command=self.simulation)
        button.grid(column=3,row=9)

    def simulation(self):
        print self.c2_low.get()
        #code for this not included but uses all 16 entries/variable

if __name__ == "__main__":
    app = simulation_tk(None)
    app.title('Simulation')
    app.mainloop()

请注意,我也更改了按钮,但现在如果您在条目中写入内容,然后按下按钮,它将被打印到控制台。从这里你应该能够将它传递给一个变量或用它做任何事情。

【讨论】:

  • 由于某种原因,它没有打印任何东西 =/
  • 我正在使用带有最新 Tkinter 的 python 2.7,它可以工作。如果我在条目中键入“asd”并按下按钮,它将出现在控制台中。
  • 啊,是的,缩进问题。非常感谢您的帮助!
【解决方案2】:

我的建议是不要使用StringVar。这根本没有必要,而且显然增加了你的困惑。这需要您稍微重构代码,但重构将使您的代码更易于维护。

第一步是将小部件创建与小部件布局分开,并保存对每个小部件的引用。本质上,我们是在记住小部件而不是记住变量。

def initialize(self):
    self.grid()

    self.c2_low = Tkinter.Entry(self)
    self.c2_high = Tkinter.Entry(self)
    ...
    self.cd_low.grid(column=0,row=1,sticky='EW')
    self.c2_high.grid(column=0,row=2,sticky='EW')
    ...
    self.resizable(False,False)

接下来,只需从simulation 中的每个条目小部件中获取值:

def simulation(self):
    c2_low = self.c2_low.get()
    c2_high = self.c2_high.get()
    ...

请注意,无论您是否使用StringVars,最后一部分都是相同的。无论哪种情况,您都可以使用.get() 方法来获取值。只是使用这种方法,您只需管理一个对象(小部件)而不是两个(小部件和变量)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2014-01-13
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多