我想通过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
。我不太确定这里与我的其他方法和变量有什么不同。
答案 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()