2012-12-18 30 views
6

Tôi đang cố gắng xây dựng GUI cơ bản bằng ttk/Tkinter.Python & ttk Sử dụng labelFrames để làm sạch khung

Tôi có một âm mưu ra một giao diện cơ bản mà có các thành phần cơ bản đúng, nhưng khi tôi cố gắng và tô điểm nó/không gian nó ra, tôi đạt đến giới hạn của tôi nhận được container TTK để chơi độc đáo ...

Ví dụ:

from Tkinter import * 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title("Text Comparitor") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.mainframe.columnconfigure(0, weight=1) 
     self.mainframe.rowconfigure(0, weight=1) 
     self.mainframe.pack() 
     ## text labels 
     ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E) 
     self.mainframe.pack(side="bottom", fill=BOTH, expand=True) 
     self.mainframe.grid() 
     ttk.Label(self.mainframe, text="Source Filename:").grid(column=1, row=2, sticky=W) 
     ttk.Label(self.mainframe, text="Source Text:").grid(column=1, row=3, sticky=W) 
     ttk.Label(self.mainframe, text="Converted Text:").grid(column=1, row=4, sticky=W) 
     ttk.Label(self.mainframe, text="Cleaned Source:").grid(column=1, row=5, sticky=W) 
     ttk.Label(self.mainframe, text="Cleaned Converted:").grid(column=1, row=6, sticky=W) 
     ttk.Label(self.mainframe, text="Details:").grid(column=1, row=7, sticky=W) 
     ## buttons 
     self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE) 
     self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S) 
     self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW) 

    def closeFrame(self): 
     self.root.destroy() 

    def nextPara(self): 
     pass 

    def prevPara(self): 
     pass 

def main(): 
    root = Tk() 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

mà kết quả trong: http://imgur.com/a/CwpCU#0

tôi đã cố gắng để thêm một đối tượng container thứ 2, một khung nhãn để giữ các đối tượng nhãn văn bản, mà kết quả trong các nút di chuyển xa hơn lên (và vì vậy tôi cho rằng tôi không tham khảo bản thân Rame vào lưới đúng:

from Tkinter import * 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title("Text Comparitor") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding="3 3 12 12") 
     self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.mainframe.columnconfigure(0, weight=1) 
     self.mainframe.rowconfigure(0, weight=1) 
     self.mainframe.pack() 
     ## text labels 
     ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E) 
     self.lfdata = ttk.Labelframe(self.root, labelwidget=self.mainframe, text='Label')# 
     self.lfdata.grid() 
     ttk.Label(self.lfdata, text="Source Filename:").grid(column=1, row=2, sticky=W) 
     ttk.Label(self.lfdata, text="Source Text:").grid(column=1, row=3, sticky=W) 
     ttk.Label(self.lfdata, text="Converted Text:").grid(column=1, row=4, sticky=W) 
     ttk.Label(self.lfdata, text="Cleaned Source:").grid(column=1, row=5, sticky=W) 
     ttk.Label(self.lfdata, text="Cleaned Converted:").grid(column=1, row=6, sticky=W) 
     ttk.Label(self.lfdata, text="Details:").grid(column=1, row=7, sticky=W) 

     ## buttons 
     self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE) 
     self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S) 
     self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW) 

    def closeFrame(self): 
     self.root.destroy() 

    def nextPara(self): 
     pass 

    def prevPara(self): 
     pass 

def main(): 
    root = Tk() 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

mà kết quả trong: http://imgur.com/a/CwpCU#1 Lưu ý hoán đổi vị trí giữa các nút abd nhãn, và chỉ là về khía cạnh nhìn thấy được của labelframe.

Tôi đang cố gắng để có được phiên bản thứ 2 để 'nhìn' như một phiên bản đẹp hơn của 1st.

Bất kỳ con trỏ nào - Tôi đã đọc xung quanh các tài nguyên/tài liệu khác nhau và không thể tìm thấy bất kỳ thứ gì phù hợp với ví dụ của tôi (rất có thể - tôi đang làm điều gì đó ngu ngốc ...) và không có gì tôi đã thử đã làm việc - bao gồm pack(), grid() và các đoạn trích khác mà tôi đã tìm thấy trong các ví dụ liên quan khác.

+0

Tốt hơn là không nên sử dụng lưới và gói trong một cửa sổ. Tôi thích lưới. Ngoài ra tôi nghĩ rằng các biến nút sẽ (với lưới mặc định) không lưu trữ những gì bạn mong đợi. Lưới không trả về một tham chiếu đến đối tượng theo như tôi nhớ. – Gonzo

+0

Các tiện ích @Phelix _Tkinter_ có thể sử dụng các trình quản lý hình học khác nhau trong cùng một cửa sổ ** miễn là chúng không chia sẻ cùng một cha mẹ **. _pack_ có thể thực hiện một số thứ nhất định với ít mã hơn; vì vậy tôi sẽ không khuyên bạn chỉ sử dụng _grid_. –

Trả lời

10

Có nhiều nơi cần điều chỉnh, hãy để chúng tôi nhận xét về chúng (có thể tôi sẽ quên điều gì đó, vì vậy hãy chắc chắn kiểm tra mã ở dưới cùng).

Trước hết, áp dụng trọng số cho các cột/hàng trong khung một mình sẽ không làm cho nó mở rộng khi bạn thay đổi kích thước cửa sổ. Bạn cần làm điều đó trong root. Sau đó bạn có thể muốn làm điều đó trong khung, để phù hợp với mong đợi của bạn về bố cục sau khi thay đổi kích thước. Trong trường hợp của bạn, điều có ý nghĩa nhất là làm cho mỗi cột có cùng trọng số> 0 và chỉ làm cho hàng thứ hai có trọng số> 0. Lý do cho các cột là bạn có 3 nút và bạn sẽ muốn tất cả các cột mở rộng không gian trống trong cùng một cách. Đối với phần thứ hai, đó là một quan sát trực tiếp xem xét rằng bạn có một Labelframe ở hàng thứ hai. Đưa ra một trọng số> 0 cho bất kỳ hàng nào khác sẽ cung cấp cho bạn một bố cục rất kỳ lạ. Đã thực hiện các vấn đề về trọng số.

Điều tiếp theo tôi quan sát được là nhãn hàng đầu của bạn với phông chữ lớn hơn. Bạn chắc chắn muốn nó trải dài 3 cột (một lần nữa, con số 3 này liên quan đến hàng nút bạn sẽ tạo sau này). Bạn cũng có thể muốn văn bản được căn giữa trong 3 cột này (tôi không chắc về tùy chọn của bạn tại đây).

Bây giờ, bạn hãy tạo Labelframe. Nó chỉ là sai, các tùy chọn labelwidget không có nghĩa là những gì bạn nghĩ rằng nó. Nó chỉ định một widget Label để phục vụ như là nhãn cho khung nhãn này. Vì vậy, việc xác định khung chính của bạn cho tham số này không có ý nghĩa gì. Có thể bạn muốn chỉ định một số văn bản hiển thị ở một vị trí nhất định trong khung nhãn. Ngoài ra, khung nhãn này cũng phải được vẽ với một cột 3.

Đối với "gridding" nói chung, tôi khuyên bạn nên chỉ định tùy chọn in_, vì vậy bạn làm rõ ràng liên quan đến tiện ích con bạn đang "gridding". Với điều đó, nó trở nên rõ ràng để bắt đầu tại column=0, row=0 mỗi lần bạn làm sâu sắc thêm mức độ phụ huynh của bạn.

Dưới đây là cách tôi điều chỉnh mã của bạn:

import Tkinter 
import ttk 

class MakeGUI(object): 
    def __init__(self,root): 
     self.root = root 
     self.root.title(u"Title") 
     ## build frame 
     self.mainframe = ttk.Frame(self.root, padding=(6, 6, 12, 12)) 
     self.mainframe.grid(sticky='nwse') 
     for column in range(3): 
      self.mainframe.columnconfigure(column, weight=1) 
     self.mainframe.rowconfigure(1, weight=1) 

     ## text labels 
     ttk.Label(self.mainframe, text=u"Label Title", anchor='center', 
       font=("Helvetica", 32)).grid(in_=self.mainframe, 
         column=0, row=0, columnspan=3, sticky="ew") 

     self.lfdata = ttk.Labelframe(self.mainframe, padding=(6, 6, 12, 12), 
       text='Labelframe') 
     self.lfdata.grid(column=0, columnspan=3, row=1, sticky='nsew') 
     info = (u"Source Filename", u"Source Text", u"Converted Text", 
       u"Cleaned Source", u"Cleaned Converted", u"Details") 
     for i, item in enumerate(info): 
      ttk.Label(self.lfdata, text=u"%s:" % item).grid(in_=self.lfdata, 
        column=0, row=i, sticky='w') 

     ## buttons 
     btn = (u"Close", u"Next", u"Prev") 
     for i, item in enumerate(btn): 
      ttk.Button(self.mainframe, text=item).grid(in_=self.mainframe, 
        column=i, row=3) 

def main(): 
    root = Tkinter.Tk() 
    root.columnconfigure(0, weight=1) 
    root.rowconfigure(0, weight=1) 
    makeGUI = MakeGUI(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Sau đây là cách có vẻ khi chương trình bắt đầu và sau khi một số thay đổi kích thước:

enter image description hereenter image description here

+1

Ồ. Cảm ơn bạn rất nhiều vì đã làm điều này. Tôi đã chọc vào nó, và đã tìm ra một vài lỗi của tôi, nhưng bạn đã thực sự giúp tôi hiểu rõ hơn về cách thức hoạt động của nó. Tôi thực sự đánh giá cao thời gian của bạn. –

Các vấn đề liên quan