2017-07-15 140 views
0

基本上我想在屏幕的一側放置一個時鐘,在另一側放置文本,我使用幀。我怎樣才能做到這一點。下面是它現在的樣子:在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() 

回答

1

一個問題是試圖混合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

1

使用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) 

您也不需要多個框架,每個標籤只需要一個框架。這是一個壞主意,真的,它也消耗更多的時間和打字。

1

我會爲標題創建一個框架,並使用類似header.pack(side="top", fill="x")的東西。然後,我會把這兩個標籤放在那個框架中,一個放在左邊,一個放在右邊。

然後,我會添加第二個框架來填充GUI的其餘部分,並且所有其他小部件都將進入該空間。