2011-09-24 16 views
11

Xây dựng một ứng dụng nhỏ để sử dụng cá nhân với Python và nghĩ rằng tôi sẽ thử dùng một chương trình GUI nhỏ bằng Tkinter. Đây là giao diện đồ họa tôi đã tạo ra cho đến nay:Bố trí GUI bằng cách sử dụng Tk Grid Geometry Manager

GUI layout using Tkinter

ứng dụng nghi ngờ:

Làm thế nào tôi có thể chắc chắn rằng ba LableFrames - A, B và C trong hình - có cùng chiều rộng? (Hay đúng hơn, có chiều rộng bằng với chiều rộng nhất của ba? Ví dụ, trong ảnh chụp màn hình, A là rộng nhất và tôi muốn B và C cũng rộng tới dòng D).

(Nó không phải tính toán động - đủ nếu tôi có thể đảm bảo rằng chiều rộng giống nhau khi tôi mã hóa nó, lần đầu tiên. Chúng không cần thay đổi khi chạy.)

Tk lưới Geometry quản lý nghi ngờ:

  1. Khi bạn sử dụng khung, là lưới (hàng, cột) cụ thể để chỉ kích thước của khung hoặc là nó tính dựa trên kích thước của hình thức (cửa sổ gốc)?

  2. Kích thước của cột được xác định trong lưới như thế nào?

  3. Tôi chưa hiểu đầy đủ về 'trọng lượng' trong lưới. Nó nên được sử dụng lúc nào?

Các Python GUI Mã:

import Tkinter 

if __name__ == '__main__': 
    form = Tkinter.Tk() 

    getFld = Tkinter.IntVar() 

    form.wm_title('File Parser') 

    stepOne = Tkinter.LabelFrame(form, text=" 1. Enter File Details: ") 
    stepOne.grid(row=0, columnspan=7, sticky='W', \ 
       padx=5, pady=5, ipadx=5, ipady=5) 

    helpLf = Tkinter.LabelFrame(form, text=" Quick Help ") 
    helpLf.grid(row=0, column=9, columnspan=2, rowspan=8, \ 
       sticky='NS', padx=5, pady=5) 
    helpLbl = Tkinter.Label(helpLf, text="Help will come - ask for it.") 
    helpLbl.grid(row=0) 

    stepTwo = Tkinter.LabelFrame(form, text=" 2. Enter Table Details: ") 
    stepTwo.grid(row=2, columnspan=7, sticky='W', \ 
       padx=5, pady=5, ipadx=5, ipady=5) 

    stepThree = Tkinter.LabelFrame(form, text=" 3. Configure: ") 
    stepThree.grid(row=3, columnspan=7, sticky='W', \ 
        padx=5, pady=5, ipadx=5, ipady=5) 

    inFileLbl = Tkinter.Label(stepOne, text="Select the File:") 
    inFileLbl.grid(row=0, column=0, sticky='E', padx=5, pady=2) 

    inFileTxt = Tkinter.Entry(stepOne) 
    inFileTxt.grid(row=0, column=1, columnspan=7, sticky="WE", pady=3) 

    inFileBtn = Tkinter.Button(stepOne, text="Browse ...") 
    inFileBtn.grid(row=0, column=8, sticky='W', padx=5, pady=2) 

    outFileLbl = Tkinter.Label(stepOne, text="Save File to:") 
    outFileLbl.grid(row=1, column=0, sticky='E', padx=5, pady=2) 

    outFileTxt = Tkinter.Entry(stepOne) 
    outFileTxt.grid(row=1, column=1, columnspan=7, sticky="WE", pady=2) 

    outFileBtn = Tkinter.Button(stepOne, text="Browse ...") 
    outFileBtn.grid(row=1, column=8, sticky='W', padx=5, pady=2) 

    inEncLbl = Tkinter.Label(stepOne, text="Input File Encoding:") 
    inEncLbl.grid(row=2, column=0, sticky='E', padx=5, pady=2) 

    inEncTxt = Tkinter.Entry(stepOne) 
    inEncTxt.grid(row=2, column=1, sticky='E', pady=2) 

    outEncLbl = Tkinter.Label(stepOne, text="Output File Encoding:") 
    outEncLbl.grid(row=2, column=5, padx=5, pady=2) 

    outEncTxt = Tkinter.Entry(stepOne) 
    outEncTxt.grid(row=2, column=7, pady=2) 

    outTblLbl = Tkinter.Label(stepTwo, \ 
      text="Enter the name of the table to be used in the statements:") 
    outTblLbl.grid(row=3, column=0, sticky='W', padx=5, pady=2) 

    outTblTxt = Tkinter.Entry(stepTwo) 
    outTblTxt.grid(row=3, column=1, columnspan=3, pady=2, sticky='WE') 

    fldLbl = Tkinter.Label(stepTwo, \ 
          text="Enter the field (column) names of the table:") 
    fldLbl.grid(row=4, column=0, padx=5, pady=2, sticky='W') 

    getFldChk = Tkinter.Checkbutton(stepTwo, \ 
          text="Get fields automatically from input file",\ 
          onvalue=1, offvalue=0) 
    getFldChk.grid(row=4, column=1, columnspan=3, pady=2, sticky='WE') 

    fldRowTxt = Tkinter.Entry(stepTwo) 
    fldRowTxt.grid(row=5, columnspan=5, padx=5, pady=2, sticky='WE') 

    transChk = Tkinter.Checkbutton(stepThree, \ 
       text="Enable Transaction", onvalue=1, offvalue=0) 
    transChk.grid(row=6, sticky='W', padx=5, pady=2) 

    transRwLbl = Tkinter.Label(stepThree, \ 
       text=" => Specify number of rows per transaction:") 
    transRwLbl.grid(row=6, column=2, columnspan=2, \ 
        sticky='W', padx=5, pady=2) 

    transRwTxt = Tkinter.Entry(stepThree) 
    transRwTxt.grid(row=6, column=4, sticky='WE') 

    form.mainloop() 

(Lưu ý: Đối với Python 2.4.3)

Trả lời

10

Nếu bạn sử dụng columnspan cùng và sử dụng dính = 'CHÚNG TÔI' trên cả ba LabelFrames thì chúng phải có cùng chiều rộng. Ví dụ, bạn muốn sử dụng

stepTwo = Tkinter.LabelFrame(form, text=" 2. Enter Table Details: ") 
stepTwo.grid(row=2, columnspan=7, sticky='WE', \ 
      padx=5, pady=5, ipadx=5, ipady=5) 

Câu hỏi

1) Khi bạn sử dụng khung, là lưới (hàng, cột) cụ thể để chỉ kích thước của khung hoặc là nó được tính toán dựa trên kích thước của biểu mẫu (cửa sổ gốc)?

Có sự phụ thuộc lẫn nhau ở đây. Kích thước ưa thích của biểu mẫu sẽ phụ thuộc vào kích thước ưa thích của trẻ em và bố cục, nhưng kích thước thực tế của trẻ sẽ phụ thuộc vào kích thước thực tế của biểu mẫu và bố cục. Bố trí được thực hiện từ trẻ em đến gốc để xác định kích thước ưa thích, và sau đó khi nó được vào thư mục gốc, kích thước ưa thích được sử dụng như kích thước thực tế (trừ khi ghi đè). Bố cục sau đó quay trở lại chỉ định kích thước thực.

2) Kích thước của cột được xác định trong lưới như thế nào?

Kích thước ưa thích của cột được xác định dựa trên chiều rộng tối ưu được ưu tiên của tất cả các mục trong hàng đó.Kích thước thực tế của cột được xác định bởi kích thước ưa thích cộng với một số phần trăm của khoảng trống thừa của tiện ích con.

3) Tôi chưa hiểu rõ 'trọng lượng' nào nằm trong lưới. Khi nào thì sử dụng ?

Trọng số xác định phần trăm không gian thừa mà tôi đã đề cập ở trên. Số lượng khoảng trống thừa cho cột là column_weight/total_weight.

+0

Câu trả lời rất hay, Vaughn. –

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