通过获取访问条目小部件

时间:2019-01-16 16:24:09

标签: python-3.x tkinter

我想通过get()方法而不是变量来访问条目窗口小部件。问题是我似乎无法通过其他方法将条目作为变量访问。我正在谈论的小部件是我的trennzeichenentry方法中的menubaroptions小部件。 这是我的代码段:

import tkinter
from tkinter.constants import *
from tkinter import messagebox
from struct import unpack
from codecs import decode

class Graphicaluserinterface(tkinter.Frame):

    @classmethod
    def main(cls):
        root = tkinter.Tk()
        root.title('Hex2Dec_Converter_APS300')
        root.minsize(560, 105)
        gui = cls(root)
        gui.grid(row=0, column=0, sticky=NSEW)
        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root['menu'] = gui.menubar
        root.mainloop()

    def __init__(self, master=None):
        super().__init__(master)
        for rowconfigure in range(5):
            self.master.grid_rowconfigure(rowconfigure,weight=1)
        for columnconfigure in range(4):
            self.master.grid_columnconfigure(columnconfigure,weight=1)
        frame1 = tkinter.Frame(master)
        frame1.grid(row=0,column=0,rowspan=5,columnspan=1,sticky=NSEW)
        frame1.columnconfigure(0,weight=1)
        frame2 = tkinter.Frame(master)
        frame2.grid(row=0,column=1,rowspan=5,columnspan=3,sticky=NSEW)
        frame2.columnconfigure(1,weight=2)
        frame2.rowconfigure(0,weight=0)
        frame2.rowconfigure(1,weight=6)
        frame2.rowconfigure(2,weight=0)
        frame2.rowconfigure(3,weight=1)
        frame2.rowconfigure(4,weight=2)
        self.entrystring = tkinter.IntVar()
        self.taktzykluszeit = tkinter.DoubleVar()
        self.menubar = tkinter.Menu(self)
        self.file_menu = tkinter.Menu(self.menubar, tearoff=FALSE)
        self.help_menu = tkinter.Menu(self.menubar, tearoff=FALSE)
        self.create_widgets()

    def create_widgets(self):
        self.menubar.add_cascade(label="File", menu=self.file_menu)
       self.file_menu.add_command(label="Options",command=self.menubaroptions)

    def menubaroptions(root):
        optionswindow = tkinter.Toplevel(root)
        optionswindow.title("Options")
        optionswindow.minsize(300,150)
        trennzeichenlabel = tkinter.Label(optionswindow,text="Length of Separator in Byte:")
        trennzeichenlabel.pack()
        trennzeichenentry = tkinter.Entry(optionswindow,textvariable=root.entrystring,width=30,justify="center")
        trennzeichenentry.pack()
        taktzykluszeitlabel = tkinter.Label(optionswindow,text="Measurementtime for all \n Temperature-Sensors in sec")
        taktzykluszeitlabel.pack()
        taktzykluszeitentry = tkinter.Entry(optionswindow,textvariable=root.taktzykluszeit,width=30,justify="center")
        taktzykluszeitentry.pack()

    def methodiwanttocallthevariablein(self):
        #call trennzeichenentry here

if __name__ == '__main__':
    Graphicaluserinterface.main()

那么我怎样才能将“ trennzeichenentry”变成一个变量,并在“ methodiwanttocallthevariablein”方法中调用它? 我总是在尝试自己时得到NameError。我不太确定这里与我的其他方法和变量有什​​么不同。

1 个答案:

答案 0 :(得分:1)

在函数内部定义变量时,如果不使用global,则该函数将假定您只想在本地分配该变量。这基本上意味着,除非将其标记为global或将其直接传递给另一个函数,否则代码中的其他任何内容都无法访问该变量。

所以添加这个:

global trennzeichenentry

menubaroptions函数中,如下所示:

def menubaroptions(root):
     global trennzeichenentry

您还需要在其他方法中定义全局变量。所有这些都表明您确实不想在课堂上使用global,应该对您的课堂进行重新设计以适当地弥补这一点。

这是代码的简化版本,显示了如何将输入字段设置为类属性,以便避免全局变量。

import tkinter as tk


class GraphicalUserInterface(tk.Tk):
    def __init__(self):
        super().__init__()
        self.minsize(560, 105)
        self.entry_string = tk.IntVar()
        self.taktzykluszeit = tk.DoubleVar()
        self.menubar_options()
        tk.Button(self, text='print entries', command=self.method_i_want_to_call_the_variable_in).grid()

    def menubar_options(self):
        optionswindow = tk.Toplevel(self)
        optionswindow.minsize(300, 150)
        tk.Label(optionswindow, text="Length of Separator in Byte:").pack()
        self.trennzeichenentry = tk.Entry(optionswindow, textvariable=self.entry_string, width=30, justify="center")
        self.trennzeichenentry.pack()
        tk.Label(optionswindow, text="Measurementtime for all \n Temperature-Sensors in sec").pack()
        self.taktzykluszeitentry = tk.Entry(optionswindow, textvariable=self.taktzykluszeit, width=30, justify="center")
        self.taktzykluszeitentry.pack()

    def method_i_want_to_call_the_variable_in(self):
        print(self.trennzeichenentry.get())
        print(self.taktzykluszeitentry.get())

if __name__ == '__main__':
    GraphicalUserInterface().mainloop()