2015-02-06 48 views
1

我在將這些單選按鈕與其他小部件一起正確網格化時遇到了一些麻煩。單選按鈕不會進入指定的行,有時會放在幾行的中間。Tkinter Radiobutton在使用widget.grid()時填充多行

我試圖讓按鈕「Quit1」和「Quit2」符合單選按鈕「One」和「Two」。

from Tkinter import * 

class myFrame(Frame): 

    def __init__(self, parent): 
     self.parent = parent 
     Frame.__init__(self, parent) 
     self.initUI() 

    def initUI(self): 
     self.grid() 
     v = IntVar() 

     r1 = Radiobutton(self.parent, text="One", variable=v, value=1) 
     r2 = Radiobutton(self.parent, text="Two", variable=v, value=2) 
     quit1 = Button(self, text = "quit1", command = self.master.destroy) 
     quit2 = Button(self, text = "quit2", command = self.master.destroy) 
     quit3 = Button(self, text = "quit3", command = self.master.destroy) 

     quit1.grid(row=0, column=0) 
     quit2.grid(row=1, column=0) 
     quit3.grid(row=2, column=0) 
     r1.grid(row=0, column=1) 
     r2.grid(row=1, column=1) 

def main(): 
    root = Tk() 
    root.geometry("250x150+300+300") 
    app = myFrame(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

回答

2

的問題是,你的單選按鈕的父窗口部件是從按鈕的父窗口部件不同。

只需更改以下兩行:

r1 = Radiobutton(self.parent, text="One", variable=v, value=1) 
r2 = Radiobutton(self.parent, text="Two", variable=v, value=2) 

要:

r1 = Radiobutton(self, text="One", variable=v, value=1) 
r2 = Radiobutton(self, text="Two", variable=v, value=2) 

記住也是小部件拉伸足以讓空間他們的自我,這就是它。

+0

完美。不過問題是:如果Radiobuttons的主人是根Tk()實例,而Buttons的主人是Frame實例,他們是如何與網格系統一起工作的? Radibuttons的位置不應該受到按鈕存在的影響。 – 2015-02-06 02:30:33

+0

一個'Frame'有它自己的網格系統,也有'Tk'的實例。想想看,如果它是另一個網格內的網格或另一個表內的表格。傳遞給小部件的第一個參數是其父部件。當您網格化或打包小部件時,它會被引用到其父部件。你的例子可以完美工作。您可以同時在Tk實例中對Frame和Radiobutton進行網格劃分。 – nbro 2015-02-06 02:37:40