Sato
Sato

Reputation: 31

Cannot use .place command for tkinter

I use .place command to indicate the place of "TEXT" (100, 70), but cannot reflect in the window even if changing it to any coordinate.

Could you specify the problem?

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()
        self.master.geometry("600x300")

    def create_widgets(self):
        self.msg1 = tk.Label(self, text = "TEXT")
        self.msg1.place(x = 100, y = 70)
        self.msg1.pack()

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

enter image description here

Upvotes: 1

Views: 131

Answers (2)

SAL
SAL

Reputation: 545

Don't use both .pack() and .place(), use one of them instead.

Let's say to use .place():

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.create_widgets()
        self.place(relwidth = 1, relheight = 1)
        self.master.geometry("600x300")

    def create_widgets(self):
        self.msg1 = tk.Label(self, text = "TEXT")
        self.msg1.place(x = 100, y = 70)

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

I replaced self.pack() with self.place(relwidth = 1, relheight = 1), so the frame will be always wide as the window.

Then I deleted self.msg1.pack().

Now it should work.

Upvotes: 1

user15801675
user15801675

Reputation:

Few corrections to make:

  1. Don't use .pack() geometry manager after .place geometry manager, or pack() will over ride .place() manager:
def create_widgets(self):
    self.msg1 = tk.Label(self, text = "TEXT")
    self.msg1.place(x = 100, y = 230)
  1. Use fill and expand parameter to pack the Frame:
self.pack(fill=tk.BOTH,expand=1)

Here is the code:

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        
        self.pack(fill=tk.BOTH,expand=1)
        self.create_widgets()
        self.master.geometry("600x300")

    def create_widgets(self):
        self.msg1 = tk.Label(self, text = "TEXT")
        self.msg1.place(x = 100, y = 230)
    

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

Upvotes: 1

Related Questions