Хорошо, вот список вещей, над которыми вы должны поработать.
Вы действительно должны сделать import tkinter as tk
и затем использовать префикс tk.
при работе с tkinter. Это предотвратит ошибочную перегрузку встроенных методов.
Python PEP8 говорит использовать 4 пробела для отступа, поэтому вместо 2 пробелов начинайте использовать 4.
Я не верю, что люди часто используют функции внутри функций, и я полагаю, что для этого есть веская причина.
Я никогда не видел использования nonlocal
(только 2 года с использованием Python на данный момент), так что для меня это ново. Обычно можно использовать global
при работе с неклассовыми функциями в tkinter. На этой ноте вы, вероятно, должны использовать класс, чтобы избежать global
.
При отслеживании счетчика следует использовать одну из числовых переменных. Например, здесь мы можем использовать IntVar()
, и тогда нам не нужно отслеживать счетчик.
Вот несколько примеров с очищенным кодом, пример не-ООП и пример класса.
То, что вы делаете в своем обновленном вопросе, это IMO странный способ создания графического интерфейса. Вот ваш пример вычищен и работает:
from tkinter import *
def showProdScreen():
root = Tk()
root.title("Production")
count = 0
countStr = StringVar()
countStr.set("0");
def countUp():
nonlocal count
nonlocal countStr
print(countStr.get())
count = count + 1
countStr.set(count)
Button(root, text="AddCnt", command=countUp, width=15, font=("Curier", 16)).pack()
Label(root, text="Count", relief=RAISED, font=("Curier", 20), width=10).pack()
Label(root, textvariable=countStr, relief=RAISED, font=("Curier", 20), width=10).pack()
root.mainloop()
showProdScreen()
Тем не менее, я не уверен, почему вы строите это так с помощью функции внутри функции.
При сборке не-ООП способом вы должны использовать global и здесь.
Для примера без ООП я бы сделал что-то вроде этого:
import tkinter as tk
root = tk.Tk()
root.title("Production")
count_str = tk.IntVar()
count_str.set(0)
def countUp():
global count_str
count_str.set(count_str.get() + 1)
tk.Label(root, textvariable=count_str, relief="raised", font=("Curier", 20), width=10).pack()
tk.Label(root, text="Count", relief="raised", font=("Curier", 20), width=10).pack()
tk.Button(root, text="AddCnt", command=countUp, width=15, font=("Curier", 16)).pack()
root.mainloop()
Для примера класса я бы сделал это:
import tkinter as tk
class Example(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Production")
self.count_str = tk.IntVar()
self.count_str.set(0)
tk.Label(self, textvariable=self.count_str, relief="raised", font=("Curier", 20), width=10).pack()
tk.Label(self, text="Count", relief="raised", font=("Curier", 20), width=10).pack()
tk.Button(self, text="AddCnt", command=self.count_up, width=15, font=("Curier", 16)).pack()
def count_up(self):
self.count_str.set(self.count_str.get() + 1)
Example().mainloop()