NameError: имя 'click_entry' не определено (Python) - PullRequest
0 голосов
/ 10 мая 2018
from tkinter import *

class fidgetSpinner:    


    def spin():
        status_str = float(click_entry.get())

    window = Tk() # Create a window
    window.title("11.2 GUI")


    mainframe = Frame(window)
    mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
    mainframe.columnconfigure(0, weight=1)
    mainframe.rowconfigure(0, weight=1)

    click_entry = Entry(mainframe, width=20)
    click_entry.grid(column=2, row=1, sticky=(W, E))

    click = click_entry.get()
    status_str = StringVar()

    Label(mainframe, textvariable=status_str).grid(column=2, row=2, sticky=(W, E))
    Button(mainframe, text="Fidget Click!", command=spin).grid(column=2, row=3, sticky=W)

    Label(mainframe, text="Enter Click Count:").grid(column=1, row=1, sticky=W)
    Label(mainframe, text="status:").grid(column=1, row=2, sticky=E)
    Label(mainframe, text=click).grid(column=2, row=2, sticky=E)

    window.mainloop() # Create an event loop

myWidgets = fidgetSpinner() # Create GUI


myWidgets = fidgetSpinner() # Create GUI

Когда я запускаю эту программу и ввожу какой-то текст, а когда я ввожу какое-то число в

click_entry = Entry(mainframe, width=20) и нажмите Fidget Click!

это просто говорит

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1699, in __call__
    return self.func(*args)
  File "/Users/kalib/OneDrive - University of Tasmania/Programming introduction KIT001/11.2dn GUI/11.2dn GUI.py", line 7, in spin
    status_str = float(click_entry.get())
NameError: name 'click_entry' is not defined

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

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Попробуйте это:

from tkinter import *


class fidgetSpinner:
    def __init__(self):
        window = Tk()
        window.title("11.2 GUI")

        mainframe = Frame(window)
        mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
        mainframe.columnconfigure(0, weight=1)
        mainframe.rowconfigure(0, weight=1)

        self.click_entry = Entry(mainframe, width=20)
        self.click_entry.grid(column=2, row=1, sticky=(W, E))

        click = self.click_entry.get()

        status_str = StringVar()

        Label(mainframe, textvariable=status_str).grid(column=2, row=2, sticky=(W, E))
        Button(mainframe, text="Fidget Click!", command=self.spin).grid(column=2, row=3, sticky=W)

        Label(mainframe, text="Enter Click Count:").grid(column=1, row=1, sticky=W)
        Label(mainframe, text="status:").grid(column=1, row=2, sticky=E)
        Label(mainframe, text=click).grid(column=2, row=2, sticky=E)

        window.mainloop()

    def spin(self):
        status_str = float(self.click_entry.get())

myWidgets = fidgetSpinner()
0 голосов
/ 10 мая 2018

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

class Foo:
    x = 1
    def foo():
        print(x)

Если вы вызовете Foo.foo(), это даст вам ошибку о x, так как переменная, определенная с таким именем в классе, недоступна длянепосредственно к функции.

Это одна из причин, по которой вам обычно следует определять переменные, которые вы собираетесь использовать в своем классе, в качестве атрибутов self, обычно в методе __init__.Другие методы могут использовать ту же нотацию атрибута, чтобы позже получить доступ к значению:

class Foo2:
    def __init__(self):
        self.x = 1

    def foo(self): # note, self argument!
        print(self.x)

Обратите внимание, однако, что код в Foo в моем первом примере сработал бы, если бы он был полностью удален из класса,Если бы x была переменной в глобальном пространстве имен, а foo была функцией верхнего уровня, проблем не было бы.Таким образом, альтернатива исправлению вашего класса (как и ответ Константина делает довольно хорошо) - это избавиться от класса и просто получить кучу глобального кода.Класс может быть лучше в долгосрочной перспективе, но это не обязательно, и просто написание простого кода скрипта может быть проще, когда вы только изучаете Python и tkinter.

0 голосов
/ 10 мая 2018

пожалуйста, добавьте дополнительную строку, как это, это решит проблему

global click_entry # to declare it as a global variable so yoou can access from any where 
click_entry = Entry(mainframe, width=20)
click_entry.grid(column=2, row=1, sticky=(W, E))

здесь click_entry должен быть глобальной переменной, и вы пытаетесь получить к ней доступ из области видимости приватной переменной

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