【问题标题】:How to center frame in tkinter Canvas如何在 tkinter Canvas 中居中框架
【发布时间】:2014-12-29 16:59:05
【问题描述】:

我有一个带有多个 Windows 的 GUI。其中一个窗口太大,所以不得不实现一个滚动条,这必须用一个画布来完成。这导致了问题,即 Canvas 永远不会位于 Window 的中间,它会自动具有显示的大小。

如何将 Canvas 居中显示窗口的中间(和顶部),同时仍将滚动条保持在右侧? 我知道第一帧(frame0)并不是真正需要的,但它让我之后更容易。 我更新了下面的脚本,因此它可以独立运行。我知道这不是很好,但它基本上是我所有代码的总结。

感谢您的帮助。

from Tkinter import *


class GUI:

    def __init__(self, parent):

        self.myParent = parent

        self.frame = Frame(self.myParent, bd = 2, relief = GROOVE, padx = 20, pady = 20)


        self.RWidth=self.frame.winfo_screenwidth()
        self.RHeight=self.frame.winfo_screenheight()
        self.myParent.geometry("%dx%d+0+0" % (self.RWidth, self.RHeight))  # Make Window fullscreen if no other geometry definition


    def GUI(self):

        self.myParent.title("Transport to Sorting-Point")  # Title of Window

        self.frame0 = Frame(self.myParent)
        self.frame0.pack(expand=True, fill=BOTH)     
        self.canvas = Canvas(self.frame0)
        self.vsb = Scrollbar(self.frame0, orient=VERTICAL, command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set, highlightthickness=0)
        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side=TOP, anchor=W, expand=True, fill=BOTH)
        self.frame = Frame(self.canvas, bd = 2, relief = GROOVE, padx = 20, pady = 20)
        self.canvas.create_window((0,0), window=self.frame, anchor = N)
        self.frame.bind("<Configure>", self.OnFrameConfigure)

        self.Text = Label(self.frame, text='This is a Text ', justify = LEFT).grid(row=0, column=0)


        self.frame0.mainloop()

    def OnFrameConfigure(self, event):
        self.canvas.config(scrollregion = self.canvas.bbox('all'))


def main():         
    root = Tk()
    myapp = GUI(root)
    myapp.GUI()

    root.option_clear

if __name__ == '__main__':
    main()

【问题讨论】:

  • 您的代码无法运行。它似乎是某个类的方法,但该类的其余部分丢失了。您也没有向我们展示 GUI 是什么。如果没有其余代码,我们必须猜测您正在使用哪些其他小部件和打包/放置/网格选项。
  • 我编辑了我的脚本,所以它可以单独运行。我希望你现在能帮助我!抱歉之前的脚本不好。
  • 我没有发现问题。当我运行您的代码时,画布会填满整个窗口,所以当您说要居中时,我不知道您的意思。
  • 是的,画布填满了整个窗口,但 self.frame 在左上角,我想居中。
  • 您应该澄清您的问题,因为听起来您希望画布居中,但如果我现在理解正确,您希望画布的 contents 居中。对吗?

标签: python canvas tkinter frame


【解决方案1】:

既然您知道画布的宽度和高度,只需通过一些数学运算将框架放在画布的中心:

x0 = self.frame.winfo_screenwidth()/2
y0 = self.frame.winfo_screenheight()/2
self.canvas.create_window((x0,y0), window=self.frame, anchor = "center")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 2015-01-10
    • 2021-02-18
    • 2020-11-20
    • 2015-04-09
    • 2022-01-09
    • 2019-10-16
    • 2012-04-08
    相关资源
    最近更新 更多