【问题标题】:Python Tkinter Canvas shall fill Tk() window initially or when resized, but does notPython Tkinter Canvas 最初或在调整大小时应填充 Tk() 窗口,但不会
【发布时间】:2017-11-29 20:40:32
【问题描述】:

如果这是我的代码:

from tkinter import *
    class Program:
        def __init__(self):
            self.tk = Tk()
            self.tk.attributes("-topmost", 1)
            self.canvas = Canvas(self.tk, height=500, width=500, highlightthickness=0)
            self.canvas.pack(fill="both", expand=1)
            self.width = 500
            self.height = 500
            self.tk.bind("<Configure>", self.resize)
            self.input = Entry(self.tk)
            self.input.pack(fill="x", expand=1)
            self.button = Button(self.tk, text="Start!", command=self.pressed)
            self.button.pack(fill="x", expand=1)
            self.pressed = 0
            self.start = time()
        def mainloop(self):
            while 1:
                self.canvas.delete("all")
                self.canvas.create_rectangle(0, 0, self.width, self.height, fill="#4dffff", width=0)
                self.tk.update()
        def pressed(self):
            self.pressed = 1
        def resize(self, event):
            self.width = event.width
            self.height = event.height
Program().mainloop()

如果我运行它,则会打开此窗口:

如果我再移动窗口,它看起来像这样:

只要我调整它的大小(例如全屏),我就会得到这个窗口:

我将如何更改代码以始终使画布(我的意思是它的彩色部分)覆盖 Tk() 窗口的未覆盖部分?

【问题讨论】:

标签: python canvas tkinter resize fullscreen


【解决方案1】:

您有很多错误和/或不必要的代码导致各种问题。归结为您不应该创建自己的mainloop。除非您深刻理解为什么会这样,否则请使用Tkinter 提供的那个。

在尝试做任何其他事情之前从这段代码开始:

from tkinter import *
from time import time

class Program:
    def __init__(self):
        self.tk = Tk()
        self.tk.attributes("-topmost", 1)

        self.canvas = Canvas(self.tk, height=500, width=500, highlightthickness=0)
        self.input = Entry(self.tk)
        self.button = Button(self.tk, text="Start!", command=self.pressed)

        self.button.pack(side="bottom", fill="x", expand=0)
        self.input.pack(side="bottom", fill="x", expand=0)
        self.canvas.pack(fill="both", expand=1)

        self.pressed = 0
        self.start = time()

    def begin(self):
        self.tk.mainloop()

    def pressed(self):
        self.pressed = 1

Program().begin()

【讨论】:

  • 在这种情况下,我是在 begin 方法中还是在类外添加更多代码,您是否必须重复(循环)键入 self.tk.mainloop()?
  • @RonLauterbach:这完全取决于您在谈论什么“进一步的代码”。一般来说,我会说不,begin 中不需要更多代码。不,您不必“必须重复(循环)键入 self.tk.mainloop(). Like it's name implies, it _is_ a loop already. You should call mainloop` 一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2017-11-18
  • 2012-04-23
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多