2016-02-27 69 views
0

我希望我的標籤在圖中顯示在的同一列中。它們都是通過點擊生成的。我將它們放在網格的同一列中,但圖像顯示在鄰居列中。什麼原因以及如何糾正?Python 3 tkinter圖像顯示在錯誤的列中

這是我的簡化代碼。

from tkinter import * 
from tkinter import ttk 

class App(Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master, padding='20') 
     self.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.create_button() 

    def create_button(self): 
     self.button = ttk.Button(self, 
           text="Click", 
           width=12, 
           command=lambda: self.display_name_and_picture() 
           ).grid(column=2, columnspan=2, row=1, sticky=NW) 

    def display_name_and_picture(self): 
     random_label = ttk.Label(self, font=(None, 16), text='random random') 
     random_label.grid(row=0, column=5, sticky=N) 

     random_image = PhotoImage(file='random.gif') 
     label = Label(image=random_image) 
     label.image = random_image 
     label.grid(row=1, column=5, sticky=NW) 

root = Tk() 
root.title("Random something...") 
root.geometry("600x300") 
app = App(root) 
root.mainloop() 
+0

在你的'create_button'方法改變'command'到 '命令=​​ self.display_name_and_picture' – styvane

+1

'自我.button = ttk.Button(...)。grid(...)'將self.Button設置爲None。如果你不需要'self.button',就取消分配。如果你這樣做,將語句分成'self.button = ttk.Button(...)'和'self.button.grid(...)'。 –

+0

第二個標籤缺少'ttk'前綴。 'label.image'屬性分配似乎沒用。 –

回答

2

罪魁禍首是這條線

label = Label(image=random_image) 

創建label不指定其父節點,因此其父默認爲root。但random_labelapp作爲其父母,而approot作爲其父母。所以labelapp ---內root ---並不在app並列網格,如你所願。只要將上面的行改爲

label = Label(self, image=random_image) 

你應該沒問題。

(嗯,不是完全罰款。你也應該解決人們評論中指出的東西。)

+0

添加缺少的'self'修復了主要問題(至少在我做了其他調整的情況下)。 –

+0

@鰓,謝謝你,作品像一個魅力! – oboer

-1

我在這附近徘徊了一段時間,並且生產出了一些能夠滿足你要求的東西。我很想有人解釋爲什麼這個工程。列看起來愚蠢。

檢查出來:

from tkinter import * 
from tkinter import ttk 

class App(Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master, padding='20') 
     self.grid(column=0, row=0, sticky=(N, W, E, S)) 
     self.create_button() 

    def create_button(self): 
     self.button = ttk.Button(self, 
           text="Click", 
           width=12, 
           command=self.display_name_and_picture 
           ) 
     self.button.grid(column=0, columnspan=2, row=0, sticky=NW) 

    def display_name_and_picture(self): 
     random_label = ttk.Label(self, font=(None, 16), text='random random') 
     random_label.grid(row=0, column=2) 
     random_image = PhotoImage(file='random.gif') 
     label = Label(image=random_image) 
     label.image = random_image 
     label.grid(row=1, column=0) 


root = Tk() 
root.title("Random something...") 
root.geometry("600x300") 
app = App(root) 
root.mainloop() 
+0

你得到這個工作,因爲雖然'label'仍然在'app'之外,你在'0'列0行'root'和grid'label'在第0列,第1行在'root'(我的答案解釋了爲什麼這樣)。所以是'label'在'app'下面。 – gil