Окно tkinter изменяет размер в увеличенном состоянии, когда его размер не изменяется - PullRequest
1 голос
/ 15 марта 2020

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

  • ОС: Windows 10 Home
  • Python: 3.7
  • Tk / Tcl: 8,6

Воспроизводимый пример:

from tkinter import Tk

root=Tk()
root.state('zoomed') #until here is everything normal
root.resizable(False,False) #here taskbar gets hidden
root.mainloop()

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Поработав с решением jizhihaoSAMAs и своими собственными идеями, я пришел к следующему:

from tkinter import *

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.state('zoomed')
        self.update()
        self.maxsize(-1,self.winfo_height())
        self.state('normal')
        self.wip=False
        self.lastgeom=None
        self.bind('<Configure>',self.adopt)
        #without this after disabling and reenabling resizing in zoomed state
        #the window would get back to normal state but not to it's prior size
        #so this behavior is secured here
        self.bind('<x>',self.locksize)
        #enable/disable active resizing
    def adopt(self,event):
        if not self.wip:
            self.wip=True
            if self.state()=='zoomed' and not self.lastgeom:
                self.state('normal')
                self.update()
                self.lastgeom=self.geometry()
                self.state('zoomed')
            elif self.state()=='normal' and self.lastgeom:
                self.geometry(self.lastgeom)
                self.lastgeom=None
            self.wip=False
    def locksize(self,event):
        if self.resizable()[0]: self.resizable(False,False)
        else: self.resizable(True,True)

if __name__=='__main__':
    App().mainloop()

Я знаю, что это немного неуклюже, но работает как шарм.

1 голос
/ 16 марта 2020

Наконец-то я понял, это то, что вы хотите?

from tkinter import *

def SetSize():
    width, height, X_POS, Y_POS = root.winfo_width(), root.winfo_height(), root.winfo_x(), root.winfo_y()
    root.state('normal')
    root.resizable(0,0)
    root.geometry("%dx%d+%d+%d" % (width, height, X_POS, Y_POS))

root=Tk()
root.state('zoomed') #until here is everything normal
root.after(100,SetSize)
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...