2014-02-06 119 views
0
class input_data(Tkinter.Tk): 
    def __init__(self): 
     Tkinter.Tk.__init__(self); 
     self.resizable(width=False,height=False); 
     self.geometry('500x500'); 
     t = ['frame','input_text']; 
     for i in t: 
      eval('self.'+i+'()'); 
def frame(self): 
    self.f = Tkinter.Frame(self,width=200,height=200,bg='cyan'); 
    self.f.grid(row=0,column=0); 

def input_text(self): 
    self.e = Tkinter.Entry(self.f); 
    self.e.grid(row=0,column=0); 

root = input_data(); 
root.mainloop(); 

的代碼看起來不錯,但框架不適合表示dedida,但如果你做下面的代碼Tkinter的網格和框架沒有調整大小框架

import Tkinter as tk 

class SimpleApp(object): 
    def __init__(self, master, **kwargs): 
    title = kwargs.pop('title') 
    frame = tk.Frame(master, borderwidth=5, bg = 'cyan', **kwargs) 
    frame.grid() 
    button = tk.Button(frame, text = title) 
    button.grid(sticky = tk.SE) 
    frame.rowconfigure('all', minsize = 200) 
    frame.columnconfigure('all', minsize = 200) 

def basic(): 
    root = tk.Tk() 
    app = SimpleApp(root, title = 'Hello, world') 
    root.mainloop() 
basic() 

在那裏我沒有作出第一碼不起作用的寬度和高度

+1

我不知道是什麼原因造成的問題,但我會用't = [self.frame,self.input_text]替換't = ['frame,input_text']' '和'我()'的eval語句。此外,你不需要Python中的分號。這是unpythonic。 – arkocal

+0

你的問題很難理解。這兩個例子都不能像你想要的那樣工作,或者只有第一個例子? –

回答

2

我不知道你正在嘗試做的。在代碼中出現了幾個錯誤。第一個問題是,正如問題中所寫的那樣,它根本不運行。你錯過了一個導入語句,並且你的縮進被搞砸了。

在你給所述框架的寬度和高度的第一個例子。但是,框架的默認行爲是自動調整大小以適應其所有子項。這就是所謂的幾何傳播因此,該框架將縮小到只是大到足以容納輸入構件。

如果你想在框架200個像素高,你需要把幾何傳播關閉寬保持在200個像素。你這樣做的東西,如:

self.f.grid_propagate(False) 

這是很少見的推薦方式做事情,但如果你真的想要的框架是完全某些特定的大小,這是做這件事。

如果你沒有希望它的確切大小,而是希望它填滿整個窗口,你需要使用在grid命令的sticky選項,並設置一個非零權重爲0的行和列0.例如:

def frame(self): 
    self.f = Tkinter.Frame(self,width=200,height=200,bg='cyan'); 
    self.f.grid(row=0,column=0, sticky="nsew"); 
    self.grid_rowconfigure(0, weight=1) 
    self.grid_columnconfigure(0, weight=1) 
+0

感謝您的回答,解決了我的問題,如果框架符合不符合高和高的內容,請嘗試您告訴我的內容。 – Francisco

相關問題