Вывод текста из функции класса?- Ткинтер - PullRequest
2 голосов
/ 05 апреля 2019

Я прошу прощения, если я не использую правильную терминологию, я новичок в Python и делаю это не спеша ради удовольствия. Я пытаюсь все выяснить сам, просматривая некоторые учебники и читая онлайн. У меня проблема в том, что я хотел создать графический интерфейс для генератора паролей Python (очень простой первый проект). Я создал правильный формат, который мне показался, но у меня проблема с отображением функции в окно GUI, а не терминал. Я думаю, что когда я прихожу к self.output, где все портит.

class GenPass:
    def __init__(self, master):
        frame = Frame()
        frame.pack()

        self.printButton = Button(frame, text="Generate Password", padx=4, pady=4, command=self.generate)
        self.printButton.pack(side=LEFT)

        self.quitButton = Button(frame, text="Copy to Clipboard", padx=4, pady=4, command=master.destroy)
        self.quitButton.pack(side=LEFT)

        self.output = Label(frame, fg="Green")
        self.output.place(x=240, y=85)
        self.output.config(text=self.generate)

    def generate(self):
        for i in range(3):
            print(random.choice(Words).capitalize(), end='')
        for i in range(2):
            print(random.choice(Numbers), end='')
        for i in range(1):
            print(random.choice(Spec_Char))

Я ожидаю, что результат будет в окне GUI, будет сгенерированный пароль. Он появляется в терминале, но не в окне. Когда он подходит к настройке output.pack (), он просто перечисляет случайные числа и имя функции (например, 9012381generate)

1 Ответ

1 голос
/ 05 апреля 2019

Внутри generate вы должны создать строку с паролем и использовать self.output.config(text=password) вместо print().

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

from tkinter import *
import random
import string

words = string.ascii_uppercase
numbers = string.digits
spec_char = '!@#$%'

class GenPass:

    def __init__(self, master):
        frame = Frame(master) # add parent for Frame
        frame.pack()

        self.printButton = Button(frame, text="Generate Password", padx=4, pady=4, command=self.generate)
        self.printButton.pack(side=LEFT)

        self.quitButton = Button(frame, text="Copy to Clipboard", padx=4, pady=4, command=master.destroy)
        self.quitButton.pack(side=LEFT)

        self.output = Label(master, fg="Green")
        self.output.pack()

        self.generate() # genrate password at start


    def generate(self):
        password = ''
        for i in range(3):
            password += random.choice(words)
        for i in range(2):
            password += random.choice(numbers)
        for i in range(1):
            password += random.choice(spec_char)
        self.output.config(text=password)


root = Tk()
GenPass(root)
root.mainloop()

enter image description here

Кстати: у каждого виджета должен быть родитель, поэтому я добавляю master в Frame(),Возможно, здесь нет никакой разницы, но если у вас будет много фреймов или виджетов, тогда виджет без родителя может отображаться в неожиданном месте.

pack(), place() и grid() не должны смешиваться в одномокно или фрейм, потому что pack() и grid() пытаются вычислить позицию динамически, и другой менеджер слоев может создать проблему с этим.Но с помощью pack/grid/place вы можете поместить frame, а внутри этого frame вы можете использовать другой менеджер слоев (pack/grid/place).

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