Почему я получил «Дисплей не способен к DPMS»? - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу проверить код кнопки. Однако это только дало мне результат: Дисплей не способен к DPMS. Почему?

from tkinter import *
# tkinter

class Root(Tk):
  def __init__(self):
  # define self
    super(Root, self),__init__()
    self.title("Tkinter Button")
    # title of new window
    self.minsize(640,400)
    # size of button
    self.wm_iconbitmap('icon.ico')




    button = Button(self, text = "Click Me")
    # text on the button
    button.grid(column = 0, row = 0)
    # location in the new window opened

    root = Root()
    root.mainloop()

1 Ответ

1 голос
/ 17 апреля 2020

Display is not capable of DPMS это не ошибка, это просто предупреждение, ваш код будет работать в любом случае. Ваша настоящая проблема здесь в том, что вы не mainloop набираете права tk.Root.

Возможно, вы застряли в бесконечной рекурсии, потому что вы инициализируете объект Root в рамках инициализации Root object.

class Root(Tk):
    def __init__(self):
        super().__init__()

        # you are initializing another Root object here!
        root = Root()  
        # that will itself initialize another Root object,
        # and that will itself initialize another Root object, etc.

        root.mainloop()  # this statement will never be reached

То, что вы на самом деле хотите, - это вызов mainloop для вновь созданного Root объекта. В методе __init__ этот вновь созданный объект - просто self. Этот код должен работать так, как вы ожидаете.

class Root(Tk):
    def __init__(self):
        super().__init__()

        self.title("Tkinter Button")
        self.minsize(640,400)
        self.wm_iconbitmap('icon.ico')

        button = Button(self, text = "Click Me")
        button.grid(column = 0, row = 0)

        self.mainloop()

Также попробуйте просто запустить mainloop извне самого объекта, это обычно нежелательно делать в самой инициализации объекта Tkinter

# remove self.mainloop() from Root.__init__ first
root = Root()
root.mainloop()  # better


Примечание: вы написали super(Root, self),__init__() с запятой вместо точки, которая должна поднять NameError при создании экземпляра Root. Правильный синтаксис для инициализации объекта с родительским классом:
super(Root, self).__init__()

Или просто с использованием современного синтаксиса

super().__init__()
...