【问题标题】:Positioning a window as it changes in size在窗口大小变化时定位窗口
【发布时间】:2016-02-07 18:41:34
【问题描述】:

我想要做的是让我的窗口位于屏幕的右上角。当您浏览不同的选项时,窗口会根据显示的内容更改大小。所以我需要一些东西来检查窗口的当前大小,然后根据它的大小定位它。

我的代码:

from tkinter import *

class Main:
    def __init__(self, master):
        self.master = master
        self.win_1()

    def win_1(self):
        for child in self.master.winfo_children():
            child.destroy()
        Text(self.master, width = 10, height = 3).grid(columnspan = 2)
        Button(self.master, text = 'Win 2', width = 7, command = self.win_2).grid(row = 2, column = 0)
        Button(self.master, text = 'Exit', width = 7, command = self.master.destroy).grid(row = 2, column = 1)    
        self.position_win()

    def win_2(self):
        for child in self.master.winfo_children():
            child.destroy()
        Text(self.master, width = 20, height = 10).grid()
        Button(self.master, text = 'Win 1', command = self.win_1).grid()
        self.position_win()

    def position_win(self):
        self.h = self.master.winfo_height()
        self.w = self.master.winfo_width()
        self.master.geometry('-%d+%d' % (self.w, self.h))


root = Tk()
Main(root)

root.mainloop()

这是我能想出的最好的方法来实现我的目标。当我运行它时,窗口开始完美地位于右上角。单击按钮时,窗口 2 的右上角设置为窗口 1 的左下角。然后,当您单击返回窗口 1 时,它将右上角设置为与窗口 2 中相同的位置。从这一点开始,窗口之间的循环在窗口的右上角起作用,但窗口不在屏幕的右上角。我确信这很清楚,但如果你运行代码你会明白我在说什么。

为什么会这样,我该如何解决?

谢谢!

【问题讨论】:

    标签: tkinter position geometry python-3.3


    【解决方案1】:

    您的程序正在按照您的要求执行。引用http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/geometry.html "如果下一部分的格式为 +x,则指定窗口左侧应距桌面左侧 x 像素。如果格式为 -x,则窗口右侧距桌面左侧 x 像素桌面的右侧。"

    所以你告诉 tk 将窗口放在前一个窗口的宽度远离右边缘。垂直位置也是如此。唯一的“谜团”是为什么它第一次出现在角落里。原因是self.master.geometry() 最初是1x1+0+0 并且不受网格操作的影响。如果你想把窗口放在一个固定的位置,把它放在__init__方法和self.master.geometry('-0+0')中你想要的位置,然后删除位置方法和调用。

    注意:创建和销毁小部件的另一种方法是创建两个框架,并通过grid_forgeting 一个和griding 另一个进行切换。或者将两者都网格化,然后将您想要的放在上面。后者使窗口大到足以容纳两者。

    【讨论】:

    • 很好的信息。谢谢!并且问题解决了。关于您笔记中的 cmets,我确实阅读了该方法,但由于我的知识有限,创建/销毁方法更有意义。但我会在我的下一个项目中研究这种方法。再次感谢!
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 2018-08-29
    • 2015-06-29
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    相关资源
    最近更新 更多