Использование классов с Tkinter в python - PullRequest
0 голосов
/ 25 августа 2018

Привет, мне было интересно, в чем разница между первым блоком кода (который работает) и вторым (который не работает).

Block1:

from tkinter import *      

class Temp:
    def __init__(self, master):
        self.master = master
        self.var = self.userEntryFunc()
        self.var.pack()   

    def userEntryFunc(self):    
        return Entry(self.master)

def getval(x,y):
    cn1 = x.var.get()
    cn2 = y.var.get()
    print(cn1 + " and " + cn2)

root = Tk()
root.geometry("500x500")
Name = Temp(root)
Name2 = Temp(root)
b = Button(root, text="pree", command=lambda: getval(Name,Name2))
b.pack()

root.mainloop()

Block2:

from tkinter import *      


class Temp:
    def __init__(self, master):
        self.master = master

    def userEntryFunc(self):    
        return Entry(self.master)

    def getValue(self):
        self.var = self.userEntryFunc()
        self.var.pack()

def getval(x,y):
    cn1 = x.var.get()
    cn2 = y.var.get()
    print(cn1 + " and " + cn2)

root = Tk()
root.geometry("500x500")
Name = Temp(root).getValue()
Name2 = Temp(root).getValue()
b = Button(root, text="pree", command=lambda: getval(Name, Name2))
b.pack()

root.mainloop()

block2 Сообщение об ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
  File "<ipython-input-111-c906f1aea49c>", line 24, in <lambda>
    b = Button(root, text="pree", command=lambda: getval(Name, Name2))
  File "<ipython-input-111-c906f1aea49c>", line 16, in getval
    cn1 = x.var.get()
AttributeError: 'NoneType' object has no attribute 'var'

Моя главная цель - иметь несколько объектов:введите Temp, которые имеют различные определения виджетов tkinter в классе Variable, и используйте их значение в качестве переменной для будущего кода.Моя проблема в том, что я не хочу, чтобы в моей функции init было 5 разных условий для этого для разных типов переменных (ввод пользователя, кнопки, просмотр каталога).Например:

  if varName=="userEntry":
        self.var = self.userEntryFunc()
        self.var.pack()
  elif varName=="radioButton":
        self.var = self.radioButtonFunction()
        ...

1 Ответ

0 голосов
/ 25 августа 2018

В первом примере кода виджеты Entry создаются функцией __init__ (при создании экземпляра), через функцию userEntryFunc, а затем упаковываются. Однако во втором примере класс Temp ничего не создает при создании, его функция getValue должна вызываться извне.

Ошибка, с которой вы сталкиваетесь, происходит потому, что clientName и clientName2 фактически присвоены возвращаемому значению getValue, а не экземпляру Temp. Чтобы это исправить, вам нужно присвоить экземпляры переменным, а затем вызвать функцию getValue, например:

clientName = Temp(root, "Client Name")
clientName.getValue()
clientName2 = Temp(root, "Client Name2")
clientName2.getValue()

Также обратите внимание, что строка:

lister = [clientName, clientName2]

В примере 1 создаст ошибку, вместо этого используйте:

lister = [Name, Name2]

Редактировать: вышеуказанная проблема была исправлена ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...