Глобальная переменная не определена? Не удается получить метку для отображения глобальной переменной из функции

#python #tkinter

#python #tkinter

Вопрос:

Это небольшая программа, которую я создаю для изучения Python, которая является генератором признаков NPC, который генерирует случайные слова из текстового файла.

Мой генератор случайных чисел работает, но я не могу заставить его правильно отображаться в метке. В настоящее время для pertrait установлено значение global, но, похоже, оно не подбирает переменную для отображения в метке? Я попытался настроить StringVar, но, похоже, мне тоже не удалось заставить ее работать должным образом.

 import tkinter as tk
from tkinter import font


# Random Personality generation from text list
def gen():
    global pertrait
    pertrait = print(random.choice(open(
        'F:\Desktop\python\RandomGenerator py\CharTraitList.txt').read(
        ).split()).strip())


root = tk.Tk()
root.title("NPC Trait Generator")
root.geometry("500x200")
frame = tk.Frame(root)
frame.pack()

# define font
fontStyle = font.Font(family='Courier', size=44, weight='bold')

# background image variable and import
paper = tk.PhotoImage(
    file='F:\Desktop\python\RandomGenerator py\papbckgrd.png')

butQuit = tk.Button(frame,
                    text="Quit",
                    fg="red",
                    command=quit)
butQuit.pack(side=tk.LEFT)
ButGen = tk.Button(frame,
                   text="Generate",
                   command=gen)
ButGen.pack(side=tk.RIGHT)


# Label generation
Trait1 = tk.Label(root,
                  compound=tk.CENTER,
                  text=pertrait,
                  font=fontStyle)
#                  image=paper) .pack(side="right")

Trait1.pack()

root.mainloop()
  

Комментарии:

1. Вы создаете метку задолго до того, gen() как она была вызвана. Вероятно, вам следует создать (или, по крайней мере, задать текст) метки изнутри gen() , поскольку именно в этот момент вы знаете, каким будет текст метки.

2. print() не возвращает значение, поэтому pertrait устанавливается значение None.

Ответ №1:

print() не возвращает значение, и вы забыли вызвать gen() !

Изменить:

 pertrait = print(random.choice(open(
    'F:\Desktop\python\RandomGenerator py\CharTraitList.txt').read(
    ).split()).strip())
  

Для:

 pertrait = random.choice(open(
    'F:\Desktop\python\RandomGenerator py\CharTraitList.txt').read(
    ).split()).strip()
  

Но на самом деле было бы намного лучше избежать глобального — make gen() возвращает значение и присваивает результат gen() ot pertrait

Комментарии:

1. print возвращает значение; оно возвращает None . gen вызывается при нажатии кнопки. Возвращаемое значение обратного вызова не используется, следовательно, глобальная переменная.

2. Спасибо вам за это, с вашей помощью я разобрался. Как только я установил gen для возврата вместо печати, он начал работать правильно. Моя следующая задача — заставить метку обновляться при каждом нажатии кнопки «Сгенерировать». Я знаю, что кнопка работает правильно, просто нужно запустить следующую часть. Спасибо за всю вашу помощь!