Python 如何在tkinter画布中居中放置框架

Python 如何在tkinter画布中居中放置框架,python,canvas,tkinter,frame,Python,Canvas,Tkinter,Frame,我有一个带有几个窗口的GUI。其中一个窗口太大,所以必须实现一个滚动条,这必须用画布来完成。这引起了问题,即画布在窗口中间永远不会居中,这会自动显示显示器的大小。p> 如何将画布集中在显示窗口的中间(顶部),仍然保持滚动条向右移动? 我知道第一帧(frame0)并不是真的需要,但它使我以后更容易。 我更新了下面的脚本,因此它可以独立运行。我知道这不是很好,但它是我所有代码的一个宝贵的总结 谢谢你的帮助 from Tkinter import * class GUI: def __i

我有一个带有几个窗口的GUI。其中一个窗口太大,所以必须实现一个滚动条,这必须用画布来完成。这引起了问题,即画布在窗口中间永远不会居中,这会自动显示显示器的大小。p> 如何将画布集中在显示窗口的中间(顶部),仍然保持滚动条向右移动? 我知道第一帧(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()
从Tkinter导入*
类GUI:
定义初始化(自身,父级):
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_屏幕高度()
self.myParent.geometry(“%dx%d+0+0”%(self.RWidth,self.RHeight))#如果没有其他几何体定义,则使窗口全屏显示
def GUI(自我):
self.myParent.title(“传输到分拣点”)#窗口标题
self.frame0=Frame(self.myParent)
self.frame0.pack(expand=True,fill=BOTH)
self.canvas=canvas(self.frame0)
self.vsb=滚动条(self.frame0,orient=VERTICAL,command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set,highlightthickness=0)
自包装(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(“,self.OnFrameConfigure)
self.Text=Label(self.frame,Text='This is a Text',justify=LEFT).grid(行=0,列=0)
self.frame0.mainloop()
def OnFrameConfigure(自我,事件):
self.canvas.config(scrollregion=self.canvas.bbox('all'))
def main():
root=Tk()
myapp=GUI(根目录)
myapp.GUI()
root.option\u清除
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

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

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

您的代码无法运行。它似乎是某个类的方法,但缺少该类的其余部分。您也没有向我们展示什么是GUI。如果没有剩下的代码,我们必须猜测您正在使用哪些其他小部件和pack/place/grid选项。我希望你现在能帮助我!很抱歉以前的脚本不好,我看不出有什么问题。当我运行你的代码时,画布填满了整个窗口,所以我不知道你说要居中是什么意思。是的,画布填满了整个窗口,但self.frame在左上角,我想居中。你应该澄清你的问题,因为听起来你想让画布居中,但是如果我现在理解正确的话,你希望画布的内容居中。是这样吗?