используйте конфигурацию, когда виджет определен в классе, tkinter python

avatar
user16360192
1 июля 2021 в 17:29
40
2
0
root = Tk()
frame=Frame(root)
frame.pack()
class lab3l(Label):
    def __init__(self):
        super(lab3l, self).__init__()
        self=Label(text="label",fg="red")
        self.pack()
l=lab3l()
button=Button(text="button",command=lambda:(l.config(fg="blue")))
button.pack()
root.mainloop()

Я не получаю никаких ошибок, но код не работает

Источник
TheLizzard
1 июля 2021 в 17:32
1

Когда вы используете super().__init__(), вы создаете 1 метку, а затем, когда вы используете self = Label(...), вы создаете другую метку. Переместите text="label" и fg="red" внутрь super().__init__() и удалите self=Label(text="label",fg="red")

Ответы (2)

avatar
TheLizzard
1 июля 2021 в 19:17
1

Как я сказал в своем комментарии:

  • Вы наследуете от Label, но создаете другой Label. Для этого нет причин.
  • Также ваш класс lab3l кажется немного бесполезным, это просто tkinter.Label, но с предустановленными text и fg.

Ваш код исправлен:

from tkinter import *

root = Tk()
frame = Frame(root)
frame.pack()

class lab3l(Label):
    def __init__(self, master):
        super().__init__(master, text="label", fg="red")

l = lab3l(root)
l.pack()
button = Button(text="button", command=lambda: l.config(fg="blue"))
button.pack()
root.mainloop()

В целом в вашем коде есть несколько вещей, которые будут считаться плохой практикой, например:

  • не передается аргумент master при создании метки
  • используя from tkinter import *
avatar
bangKok
1 июля 2021 в 18:56
-1

В конце концов решать вам. Но я лично считаю, что с ним лучше едешь, если у тебя все в классе. Так что возможно обойтись без этого типа комбинации. Потому что так оно и есть, что привело к путанице



root = Tk()
frame=Frame(root)
frame.pack()
class lab3l(Label):
    def __init__(self):
        super(lab3l, self).__init__()
        self.lbl = Label(text="label", fg= "red")
        self.lbl.pack()
    def con_any(self):
        self.lbl.config(fg="blue")
l=lab3l()
button=Button(text="button",command=l.con_any)
button.pack()
root.mainloop()

или

from tkinter import *


root = Tk()
frame=Frame(root)
frame.pack()
class lab3l(Label):
    def __init__(self):
        super(lab3l, self).__init__()
        self.lbl = Label(text="label", fg= "red")
        self.lbl.pack()

l=lab3l()
button=Button(text="button",command=lambda : l.lbl.config(fg="green")) # make a refernece to your class
button.pack()
root.mainloop()
TheLizzard
1 июля 2021 в 19:10
1

Этот код очень плохой. Вы наследуете от Label и создаете виджет Label, но никогда не вызываете для него .pack. Вместо этого вы создаете еще один Label???

bangKok
1 июля 2021 в 19:15
0

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

TheLizzard
1 июля 2021 в 19:19
0

Посмотрите на мой ответ. Это решает проблему, которую я указал, решая проблему ОП. Также целью этого сайта является помощь людям. Если что-то поможет OP, почему бы не включить это в свой ответ?

bangKok
1 июля 2021 в 19:21
0

да, но мне непонятно. вы ждете комментарий от другого пользователя? ваш первый пост был час назад. так почему нет ответа? Я здесь не для того, чтобы кого-то ругать, я хочу узнать полезную информацию

TheLizzard
1 июля 2021 в 19:25
0

Я тоже здесь, чтобы учиться. Кроме того, если я могу уместить весь ответ в несколько предложений, я считаю бессмысленным писать ответ, когда я могу написать комментарий. Опять же, я хочу помочь другим людям и узнать что-то новое. Я написал ответ, чтобы показать вам, как вы могли бы решить проблему ОП, устранив проблему, на которую я указал. Это также ускоряет код и занимает меньше места.

bangKok
1 июля 2021 в 19:36
0

ХОРОШО. может я это пропустил. потому что мне интереснее получить решение, чем опубликовать его в этих субтитрах. Тут много светлых умов, которые, на мой взгляд, вкладывают в эти субтитры слишком много текста. Парню, который задал вопрос, было бы лучше помочь, если бы вы сразу представили это решение. И мне действительно нравится ваше решение больше, чем мое.

TheLizzard
1 июля 2021 в 19:41
1

Проблема с написанием решений заключается в том, что они должны быть формальными и длинными. Также я считаю своим долгом рассмотреть хотя бы некоторые из плохих практик/неправильных представлений. Вот почему я пишу комментарии, но вы правы, если комментарий слишком длинный, люди не будут его читать. Также, если вы удалите наследование из своего ответа, это будет лучший ответ, чем мой.