доступ к виджету входа через get - PullRequest
0 голосов
/ 16 января 2019

Я хочу получить доступ к виджету записи с помощью метода 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" в переменную и назвать ее в методе "methoddiant для вызова thevariablein"? Я всегда получал NameError, когда пробовал себя. Я не совсем уверен, что здесь отличается от других моих методов и переменных, которые у меня есть.

1 Ответ

0 голосов
/ 16 января 2019

При определении переменной внутри функции, если вы не используете global, функция будет предполагать, что вы хотите назначить эту переменную только локально.В основном это будет означать, что ничто другое в вашем коде не может получить доступ к этой переменной, если вы не пометите ее как global или не передадите ее непосредственно другой функции.

Так добавьте это:

global trennzeichenentry

Inфункция 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...