在Tkinter中彼此相邻

问题描述:

基本上我想在屏幕的一侧放置一个时钟,在另一侧放置文本,我使用帧。我怎样才能做到这一点。下面是它现在的样子:在Tkinter中彼此相邻

我想使它成为时钟与同一行上的文本一致,但分开的标签。看看我的代码,看看你能不能帮助我,请!

from tkinter import * 
from tkinter import ttk 
import time 

root = Tk() 
root.state("zoomed") #to make it full screen 

root.title("Vehicle Window Fitting - Management System") 
root.configure(bg="grey80") 

Title = Frame(root, width=675, height=50, bd=4, relief="ridge") 
Title.pack(side=TOP, anchor='w') 
titleLabel = Label(Title, font=('arial', 12, 'bold'), text="Vehicle Window Fitting - Management System", bd=5, anchor='w') 
titleLabel.grid(row=0, column=0) 

clockFrame = Frame(root, width=675, height=50, bd=4, relief="ridge") 
clockFrame.pack(side=TOP, anchor='e') 
clockLabel = Label(clockFrame, font=('arial', 12, 'bold'), bd=5, anchor='e') 
clockLabel.grid(row=0, column=1) 
curtime = "" 

def tick(): 
    global curtime 
    newtime = time.strftime('%H:%M:%S') 
    if newtime != curtime: 
     curtime = newtime 
     clockLabel.config(text=curtime) 
    clockLabel.after(200, tick) 
tick() 

Bottom = Frame(root, width=1350, height=50, bd=4, relief="ridge") 
Bottom.pack(side=TOP) 


root.mainloop() 

一个问题是试图混合packgrid布局管理器,因为它们不能很好地协同工作。以下是仅使用pack的内容。 (请注意,您可以使用其中之一的框架内,就不能同时在同一时间。)

要获得同样的“行”这两个项目,另一个Frame命名topFrame已添加和titleLabelclockFrame已嵌套在其中。这允许他们作为一个单位进行活动,当他们移动或定位时,将影响他们两个,但他们在过程中将保持他们的位置(LEFTRIGHT)相对于彼此。

我还删除了curtime全局变量,因为它并不是真的必要的(正如您可以通过修改的tick()函数看到的那样)。

from tkinter import * 
from tkinter import ttk 
import time 

root = Tk() 
root.state("zoomed") #to make it full screen 

root.title("Vehicle Window Fitting - Management System") 
root.configure(bg="grey80") 

topFrame = Frame(root, width=1350, height=50) 
topFrame.pack(side=TOP, fill=X, expand=1, anchor=N) 

titleLabel = Label(topFrame, font=('arial', 12, 'bold'), 
        text="Vehicle Window Fitting - Management System", 
        bd=5, anchor=W) 
titleLabel.pack(side=LEFT) 

clockFrame = Frame(topFrame, width=100, height=50, bd=4, relief="ridge") 
clockFrame.pack(side=RIGHT) 
clockLabel = Label(clockFrame, font=('arial', 12, 'bold'), bd=5, anchor=E) 
clockLabel.pack() 

Bottom = Frame(root, width=1350, height=50, bd=4, relief="ridge") 
Bottom.pack(side=BOTTOM, fill=X, expand=1, anchor=S) 

def tick(curtime=''): #acts as a clock, changing the label when the time goes up 
    newtime = time.strftime('%H:%M:%S') 
    if newtime != curtime: 
     curtime = newtime 
     clockLabel.config(text=curtime) 
    clockLabel.after(200, tick, curtime) 

tick() #start clock 
root.mainloop() 

这里是什么样子运行:

screenshot

+0

完美的,不能相信我没有看到这一点。将框架放置在框架内而不是根部内,非常棒。感谢您的帮助。 –

+0

@Sam:很高兴听到它的帮助。注意我只是将'Bottom'' Frame'卡在'root'的底部(带'side = BOTTOM'选项)。不知道这是你想要的,还是直接在新的'topFrame'下。应该很容易改变... – martineau

使用grid(row=x, column=y)。它使邻近的物体放置更容易。 另外,考虑只使用一个框架的东西。 你也不需要指定宽度,真的(除非你使用pack/grid_propagate(0))。

frame_1 = Frame(root, width=675, height=50) 
frame_1.pack(side=TOP) 

title_lbl = Label(frame_1, text="Lol whateva", height=50, bd=4, font=('arial', 12, 'bold'), relief="ridge", anchor=wherever_you_need_this_to_be) 
title_lbl.grid(row=n, column=n) 

clock_lbl = Label(clockFrame, font=('arial', 12, 'bold'), bd=5, anchor=wherever_you_need_this_to_be) 
clock_lbl.grid(row=n, column=n) 

您也不需要多个框架,每个标签只需要一个框架。这是一个坏主意,真的,它也消耗更多的时间和打字。

我会为标题创建一个框架,并使用类似header.pack(side="top", fill="x")的东西。然后,我会把这两个标签放在那个框架中,一个放在左边,一个放在右边。

然后,我会添加第二个框架来填充GUI的其余部分,并且所有其他小部件都将进入该空间。