0

我有一个带有多个窗口的应用程序。我使用pack_forget来消除登录窗口并调用主窗口。然而,这个主窗口失去了 tkinter 的默认居中位置。窗口在位置 (0 , 0) 创建。

有没有什么简单的方法可以让这个主窗口在默认的居中位置创建?

示例代码,3 个文件 ->

主文件

#!/usr/bin/env python3

from tkinter import *
from frm_login import Wlogin

class Mainframe(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.frame = Wlogin(self)
        self.frame.pack()

    def change(self, frame):
        self.frame.pack_forget() # delete currrent frame
        self.frame = frame(self)
        self.frame.pack() # make new frame


if __name__== '__main__':
    app = Mainframe()
    app.mainloop()

frm_login.py

from tkinter import *
from frm_default import Wmain

class Func(Frame):
    def check(self, event=None):
        if self.pwd.get() == '1':
            self.master.change(Wmain)
        else:
            self.status.config(text='wrong password')


class Wlogin(Func):
    def __init__(self, master=None, **kwargs):
        Frame.__init__(self, master, **kwargs)

        master.title('Enter password')
        master.geometry('300x200')

        self.status = Label(self, fg='red')
        self.status.pack()

        self.lbl = Label(self, text='Enter password')
        self.lbl.pack()

        self.pwd = Entry(self, show='*')
        self.pwd.insert(-1, '1')
        self.pwd.pack()
        self.pwd.focus()
        self.pwd.bind('<Return>', self.check)
        self.pwd.bind('<KP_Enter>', self.check)

        self.btn = Button(self, text='Done', command=self.check)
        self.btn.pack()

        self.btn = Button(self, text='Cancel', command=self.quit)
        self.btn.pack()

frm_default.py

from tkinter import *

class Wmain(Frame):
    def __init__(self, master=None, **kwargs):
        Frame.__init__(self, master, **kwargs)
        master.title('Main application')
        master.geometry('600x400')
4

1 回答 1

2

你的忘记/重新打包代码没有什么能让这个独一无二的。您可以使用与其他方式相同的命令。所以要么自己定义位置:

master.geometry('600x400+300+400')

或使用 tk PlaceWindow 功能:

master.eval('tk::PlaceWindow . center')

或者从窗口大小和监视器大小计算位置:

master.geometry("600x400")
master.update_idletasks()
x = (master.winfo_screenwidth() - master.winfo_reqwidth()) // 2
y = (master.winfo_screenheight() - master.winfo_reqheight()) // 2
master.geometry(f"+{x}+{y}")

FWIW,我的经验告诉我,自己设置窗口大小而不是让 tkinter 计算它会导致错误。

于 2021-12-04T16:20:35.923 回答