2016-02-27 70 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