Метки Python tkinter не отображаются - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в python и в настоящее время у меня проблема с областью видимости. Я пытаюсь сделать окно всплывающим с вызовом функции. Однако я думаю, что это может быть достигнуто лучше с классом. Как я уже сказал, я новичок. Приветствуются как исправления синтаксиса, так и лучшие методы программирования. Мой код выглядит следующим образом

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)


  up = Button(root, text = "AddCnt", command = countUp, width = 15, font = ("Curier", 16))

  countl = Label(root, text = "Count", relief = RAISED, font = ("Curier", 20), width = 10)
  countVal = Label(root, textvariable = countStr, relief = RAISED, font = ("Curier", 20), width = 10)


  countVal.pack();
  countl.pack();
  up.pack()

Заранее спасибо

1 Ответ

0 голосов
/ 07 ноября 2018

Хорошо, вот список вещей, над которыми вы должны поработать.

  1. Вы действительно должны сделать import tkinter as tk и затем использовать префикс tk. при работе с tkinter. Это предотвратит ошибочную перегрузку встроенных методов.

  2. Python PEP8 говорит использовать 4 пробела для отступа, поэтому вместо 2 пробелов начинайте использовать 4.

  3. Я не верю, что люди часто используют функции внутри функций, и я полагаю, что для этого есть веская причина.

  4. Я никогда не видел использования nonlocal (только 2 года с использованием Python на данный момент), так что для меня это ново. Обычно можно использовать global при работе с неклассовыми функциями в tkinter. На этой ноте вы, вероятно, должны использовать класс, чтобы избежать global.

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