Python 3.3 Tkinter更改LabelFrame位置

2024-05-17 14:39:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图把一个labelframe放在其他一些小部件旁边,但我根本搞不懂。目前,当我使用.pack()方法时,它显示在所有其他小部件的下面。当我试图使用.grid(column=x,row=y)配置位置时,程序运行但挂起,没有GUI出现。在

这是相关代码

def createWidgets(self):
    # Create entrybox and align to grid
    self.send_entry = tk.Entry(self)
    self.send_entry.grid(row=0,column=0)
    # Create button,allign to grid, get xml
    self.change_sub = tk.Button(self,text='Change Subreddit',padx=5, pady=5, command=lambda :self.getXML(self.send_entry.get())).grid(row=0 , column=3)
    # Create scrollbar on Y-Axis
    self.lb_scrollY = tk.Scrollbar(self,orient=tk.VERTICAL)
    # On grid next to Listbox(sticky means fill whole row
    self.lb_scrollY.grid(row=1,column=4,sticky=tk.NS,rowspan=6)
    # Create Listbox and get Y from scrollbar
    self.thread_lb = tk.Listbox(self,yscrollcommand=self.lb_scrollY.set)
    # Calls function whenever a new item is selected
    self.thread_lb.bind('<<ListboxSelect>>',self.updateSelected)
    # scrolly will change the view of listbox
    self.lb_scrollY['command']=self.thread_lb.yview
    self.thread_lb.grid(row=1,column=0,sticky=tk.NS+tk.EW,columnspan=4,rowspan=3)
    self.threadFrame = tk.LabelFrame(main,text='Reddit')

    self.threadLabelTitle = tk.Label(self.threadFrame,textvariable=self.threadTitle,wraplength=200).grid(row=1,column=2,sticky= tk.EW)
    self.threadLabelAuth = tk.Label(self.threadFrame, textvariable=self.threadAuth,wraplength=200).grid(row=2,column=2,sticky = tk.EW)
    self.threadLabelPub = tk.Label(self.threadFrame, textvariable=self.threadPub,wraplength=200).grid(row=3,column=2,sticky = tk.EW)
    self.threadLabelArtLink = tk.Label(self.threadFrame, textvariable=self.threadArtLink,wraplength=200).grid(row=4,column=2,sticky = tk.EW)
    self.threadLabelThreadLink = tk.Label(self.threadFrame, textvariable=self.threadLink,wraplength=200).grid(row=5,column=2,sticky = tk.EW)
    self.threadImgLink = tk.Label(self.threadFrame, textvariable=self.threadImg,wraplength=200).grid(row=6,column=2,sticky = tk.EW)
    # self.columnconfigure(2,minsize=200)
    # self.rowconfigure(1,minsize=175)
    self.threadFrame.pack()
    self.QUIT = tk.Button(self, text="QUIT", fg="red", command=main.destroy,padx=5, pady=5).grid(row=7)

这是完整的程序,如果你愿意可以运行它。在

^{pr2}$

Tags: selfcreatecolumnthreadlabeltkgridrow
2条回答

您的问题中没有足够的信息来确切地知道您想要什么,所以我猜您希望文本为“Reddit”的labelframe位于所有其他小部件的右侧。对吗?在

如果是这样,问题就在于这两条线:

self.pack()
...
self.threadFrame.pack()

如果没有任何选项,pack会将内容放在包含小部件的任何空白空间的顶部。因此,self将填充窗口的顶部,并在其下方留下空白。self.threadFrame被放置在空白区域的顶部,这就是为什么这两个小部件看起来是堆叠的。在

如果您尝试将第二条语句切换为使用grid,GUI将像您报告的那样挂起,因为当两个小部件具有相同的父级时,您不能同时使用grid和pack。在

要使它们并排排列,一个简单的修复方法是在打包时显式:

^{pr2}$

我使用expand将导致threadFrame在调整窗口大小时增大和缩小。我不知道这是不是你想要的行为。您可以在调整窗口大小时使用展开选项来查看它们对窗口的影响。在

您可以很容易地使用网格来获得完全相同的结果,只要您同时使用网格:

self.grid(row=0, column=0, sticky="nsew")
...
self.threadFrame.grid(row=0, column=1, stick="nsew")
...
main.grid_columnconfigure(1, weight=1)
main.grid_rowconfigure(0, weight=1)

如您所见,使用网格,您必须做一些额外的工作来获得相同的大小调整行为。这就是为什么在应用程序的不同部分同时使用grid和pack是很好的:当您想将几个小部件并排放置或垂直堆栈中时,pack非常好。当您有一个可以在行和列中指定的更复杂的布局时,网格非常有用。不过,正如我前面所说的,请确保不要将grid和pack混合使用同一个父级的两个或多个widget。在

请尝试此代码并使用place方法而不是pack

from tkinter import *
root=Tk()
mylabel = Label(root,text="This is my lablel.")
mylabel.place(x=30,y=30,height=20,width=100)

相关问题 更多 >