从Tkinter中获取变量

时间:2018-02-28 17:54:40

标签: python tkinter tkinter-entry

我想问一下是否有人知道如何从Tkinter中的Entry中获取变量以用于将来的计算。

让我们假设我想创建一个提示,其中用户需要在两个不同的Entry小部件中放置两个数字。

这些数字将用于另一个脚本进行计算。如何从Tkinter中创建的提示中检索值?

在我看来,我需要使用下面的代码创建一个函数,并使其从Tkinter提示符返回值。但是,我无法返回数字,因为我正在破坏根窗口。我怎样才能通过这个,最好没有全局变量。

最好的问候

from tkinter import *
from tkinter import ttk

#Start of window
root=Tk()
#title of the window
root.title('Title of the window')


def get_values():
    values=[(),(value2.get())]

    return values




# Creates a main frame on the window with the master being the root window
mainframe=ttk.Frame(root, width=500, height=300,borderwidth=5, relief="sunken")
mainframe.grid(sticky=(N, S, E, W))


###############################################################################
#
#
# Label of the first value
label1=ttk.Label(master=mainframe, text='First Value')
label1.grid(column=0,row=0)

# Label of the second value
label2=ttk.Label(master=mainframe, text='Second Value')
label2.grid(column=0,row=1)




###############################################################################
#
#
# Entry of the first value
strvar1 = StringVar()
value1 = ttk.Entry(mainframe, textvariable=strvar1)
value1.grid(column=1,row=0)

# Entry of the second value
strvar2 = StringVar()
value2 = ttk.Entry(mainframe, textvariable=strvar2)
value2.grid(column=1,row=1)


# Creates a simplle button widget on the mainframe
button1 = ttk.Button(mainframe, text='Collect', command=get_values)
button1.grid(column=2,row=1)



# Creates a simplle button widget on the mainframe
button2 = ttk.Button(mainframe, text='Exit', command=root.destroy)
button2.grid(column=2,row=2)




root.mainloop()

3 个答案:

答案 0 :(得分:1)

您使用类是因为类实例及其变量在tkinter退出后仍然存在。https://www.tutorialspoint.com/python/python_classes_objects.htm您可能需要重新检查一些文档要求,即语句是 “root.title('窗口标题')​​”,添加说明“窗口的#title”只是浪费你的时间..

""" A simplified example
"""

import sys
if 3 == sys.version_info[0]:  ## 3.X is default if dual system
    import tkinter as tk     ## Python 3.x
else:
    import Tkinter as tk     ## Python 2.x

class GetEntry():
    def __init__(self, master):
        self.master=master
        self.entry_contents=None
        self.e = tk.Entry(master)
        self.e.grid(row=0, column=0)
        self.e.focus_set()


        tk.Button(master, text="get", width=10, bg="yellow",
               command=self.callback).grid(row=10, column=0)

    def callback(self):
        """ get the contents of the Entry and exit
        """
        self.entry_contents=self.e.get()
        self.master.quit()

master = tk.Tk()
GE=GetEntry(master)
master.mainloop()

print("\n***** after tkinter exits, entered =", GE.entry_contents)

答案 1 :(得分:0)

  1. 在python中,函数是 objects ,因为get_values是一个对象。
  2. 对象可以有属性。
  3. 使用这两个,以及我们无法从按钮命令真正返回的知识,我们可以将属性附加到已经全局的对象,并简单地将其用作返回值。

    按钮

    的示例
    try:                        # In order to be able to import tkinter for
        import tkinter as tk    # either in python 2 or in python 3
    except ImportError:
        import Tkinter as tk
    
    
    def on_button_press(entry):
        on_button_press.value = entry.get()
        entry.quit()
    
    
    def main():
        root = tk.Tk()
        entry = tk.Entry(root)
        tk.Button(root, text="Get Value!", command=lambda e = entry : on_button_press(e)).pack()
        entry.pack()
        tk.mainloop()
        return on_button_press.value
    
    
    if __name__ == '__main__':
        val = main()
        print(val)
    

    简约示例

    1. 同样,模块也是对象,如果您想避免极度占用全局命名空间,可以将新属性附加到您正在使用的模块
    2. 请参阅:

      try:                        # In order to be able to import tkinter for
          import tkinter as tk    # either in python 2 or in python 3
      except ImportError:
          import Tkinter as tk
      
      
      if __name__ == '__main__':
          tk.my_value = lambda: [setattr(tk, 'my_value', entry.get()), root.destroy()]
          root = tk.Tk()
          entry = tk.Entry(root)
          root.protocol('WM_DELETE_WINDOW', tk.my_value)
          entry.pack()
          tk.mainloop()
          print(tk.my_value)
      

答案 2 :(得分:0)

所以,我采用了Curly Joe的例子并用他的草图制作了一个函数

最终结果,对于任何想要将其用作输入对话框模板的人来说:

disposableList = list
for i in disposableList:
    disposableList.remove(i)
    if i in disposableList:
        end = True