2017-07-15 23 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

1つの問題は、よく一緒に再生されないので、packgridレイアウトマネージャを混在させようとしています。以下はpackを使用しているものです。 (あなたがだけではない、両方同時に、フレーム内のいずれかのいずれかを使用することができます。)

は同じ「行」に2つのアイテムを取得するには、追加されたtopFrameをという名前の別のFrametitleLabelclockFrameその中にネストされています。これにより、すべての行為者が1つの単位として許可され、移動または配置されたときに両方に影響を及ぼしますが、プロセス内でその位置(LEFTおよびRIGHT)を互いに対して保持します。

グローバル変数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:聞いて嬉しいです。ちょうど 'root 'の底に' Bottom''フレームを貼り付けました( 'side = BOTTOM'オプション付き)。それがあなたが望む場所か、代わりに新しい 'topFrame'の直下にあるのかどうかは分かりませんでした。変更するのは簡単です... – martineau

1

grid(row=x, column=y)を使用してください。それは、隣接する物体の配置をはるかに容易にする。 また、何かのフレームを1つだけ使用することを検討してください。 widthを指定する必要もありません(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つのフレームしか必要としませんでした。それは本当に悪いアイデアです、そして、それはまた、より多くの時間とタイピングを消費します。

1

私はヘッダーのフレームを作成し、header.pack(side="top", fill="x")のようなものを使用します。次に、そのフレームに2つのラベルを貼り、1つは左に、もう1つは右に詰めます。

私は残りのGUIを埋めるために2番目のフレームを追加し、他のすべてのウィジェットはそのスペースに入ります。

関連する問題