python Tkinter将图像同等地占用到其他小部件

时间:2016-05-04 05:24:31

标签: python python-2.7 tkinter tkinter-canvas

我有这段代码。

class App(object):
    def __init__(self):
        self.root = Tk()
        self.root.attributes('-zoomed', True)
        self.root.grid_rowconfigure(0, weight=1)
        self.root.grid_columnconfigure(0, weight=1)
        self.root.grid_columnconfigure(1, weight=1)

        f1 = Frame(self.root, bd=1, bg="green")
        f3 = Frame(self.root, bd=1, bg="blue")

        self.image = Image.open("default.png")
        self.photo = ImageTk.PhotoImage(self.image)
        self.label = Label(image=self.photo)
        self.label.grid(row=0, column=1, sticky="nsew")

        f1.grid(row=0, column=0, sticky="nsew")
        f3.grid(row=1, column=0, columnspan=2, sticky="ew")

app = App()
app.root.mainloop()

,输出是 enter image description here

如何让图像同等地占据左框架?

1 个答案:

答案 0 :(得分:0)

在提供解决方案之前,我想强调一些评论:

  1. 您没有使用框架f3进行任何操作。运行程序时甚至不显示。所以我将在下面的解决方案中忽略它。
  2. 您为主框架-zoomed设置了属性attributes。我不知道你将使用它实现哪个目标。无论如何,有很多线程表明它只能运行Windows和一些像Ubuntu这样的Debian发行版。但是,我没有遇到这个问题,因为您可以阅读我在下面提供的第一个链接,这些参数是特定于平台的。因此,为了代码的可移植性,您可以使用-fullscreen代替。但是在这里,特别是对于你的情况,它甚至会影响你的GUI的任务栏,它不会显示,因此你不能通过点击关闭按钮关闭你的程序。因此,在我的解决方案中,我宁愿使用winfo_screenheight()winfo_screenwidth()self.root设置为机器屏幕的大小,并在geometry()方法中调用它们。
  3. 让我们将您的问题分成更小的问题:

    1. 您需要解决的第一个问题是如何将第一帧f1self.label设置为相等的宽度?只需将每个宽度选项设置为屏幕宽度的一半即可完成此操作:width = self.root.winfo_screenwidth()/2

    2. 完成此操作后,您需要解决在评论中阐明的第二个问题。为此,您需要在图片上应用resize()方法调整self.image的大小以适合self.label大小,并将图片的尺寸传递给它,该尺寸必须是您的标签尺寸以及常量PIL.Image.ANTIALIAS

    3. 完整程序

      所以这是完整的程序:

      '''
      Created on May 5, 2016
      
      @author: billal begueradj
      '''
      import Tkinter as Tk
      import PIL.Image
      import PIL.ImageTk
      
      class App(object):
          def __init__(self):
              self.root = Tk.Tk()       
              self.root.grid_rowconfigure(0, weight=1)
              self.root.grid_columnconfigure(0, weight=1)
              self.root.grid_columnconfigure(1, weight=1)        
              # Get width and height of the screen
              self.h= self.root.winfo_screenheight()
              self.w= self.root.winfo_screenwidth()
              # Set the GUI's dimensions to the screen size
              self.root.geometry(str(self.w) + "x" + str(self.h))
              # Set the  width of the frame 'f1' to the half of the screen width 
              self.f1 = Tk.Frame(self.root, bd=1, bg="green", width= self.w/2)
              self.f1.grid(row=0, column=0, sticky="nsew")        
              # Load the image
              self.image = PIL.Image.open("/home/Begueradj/mahomet_pedophile.jpg")       
              # Resize the image to fit self.label width 
              self.photo = PIL.ImageTk.PhotoImage(self.image)
              self.label = Tk.Label(self.root, image=self.photo,  width= self.w/2)
              self.label.grid(row=0, column=1, sticky="nsew")
      
      
      # Launch the main program      
      if __name__ == '__main__':
         app = App()
         app.root.mainloop()
      

      演示

      enter image description here

      Nota Bene

      你的评论有点不精确。它并不是说您希望整个图片看起来与框架f1大小相同,或者只是它的附加标签(self.label)。如果这是您想要做的,那么只需忽略上一个程序中的这一行:

      self.image = self.image.resize((self.w/2, self.h), PIL.Image.ANTIALIAS) 
      

      <强>演示

      输出将如下所示(图像只是位于标签的中心):

      ]