tkinter: метка для расширения конца до конца фрейма - PullRequest
0 голосов
/ 23 сентября 2019

Я создаю консоль с одной этикеткой, упаковывающей ее в рамку.Я использую пачку, а не сетку или место.

В настоящее время метка помещается в рамку и настроена для расширения.Однако расширение не простирается, чтобы расшириться до каждого края.Кроме того, при изменении размера окна виджет «Метка» не изменяется вместе с рамкой.

#!/usr/bin/python3
import tkinter as tk
import time as t


class app(tk.Tk):
    def __init__(self):
        super().__init__()
        self.canvas=tk.Canvas(self,bg="black")
        self.frame=tk.Canvas(self.canvas,bg="black")
        self.scrollbar=tk.Scrollbar(self,orient="vertical",command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)

        self.title("label insert and scrollbar test")
        self.geometry("900x400")

        self.scrollbar.pack(side=tk.RIGHT,fill=tk.Y)
        self.canvas.pack(fill=tk.X,expand=1)
        self.frame.pack(fill=tk.X,expand=1)

        self.canvas.create_window((0,0),anchor='n',window=self.frame)
        self.frame.bind("<Configure>",self.onFrameConfigure)

    def onFrameConfigure(self,event):
        pass

    def run(self):
        ntime=t.asctime(t.gmtime())
        n=tk.Label(self.frame,text=ntime,anchor="nw",justify=tk.LEFT)
        n.config(bg="black",fg="white",font=("Courier",12))
        n.pack(fill=tk.BOTH,expand=1,padx=0)
        self.after(800,self.run)

if __name__=="__main__":
    m=app()
    m.run()
    m.mainloop()

Как сделать так, чтобы метка заполняла весь кадр?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Есть несколько причин, по которым ваш кадр не расширяется, чтобы соответствовать холсту.У вас есть несколько проблем, которые нам нужно исправить в первую очередь.

  1. self.frame=tk.Canvas(self.canvas,bg="black") на самом деле не является фреймом.

  2. onFrameConfigure не являетсяделать что-либо, и это важная часть для изменения размера рамки.

  3. self.frame.bind() должно быть self.canvas.bind(), поскольку мы используем даже то, что холст каким-то образом изменилсявызвать функцию изменения размера кадра.

  4. self.canvas.create_window((0,0),anchor='n',window=self.frame) нужен набор тегов для кадра, чтобы мы могли настроить его в функции позже.

См. Пример кода ниже и дайте мне знать, если у вас есть какие-либо вопросы.

import tkinter as tk
import time as t


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.canvas = tk.Canvas(self, bg="black")
        self.frame = tk.Frame(self.canvas, bg="black")
        self.scrollbar = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)

        self.title("label insert and scrollbar test")
        self.geometry("900x400")

        self.scrollbar.pack(side='right', fill='y')
        self.canvas.pack(fill='x', expand=True)
        self.frame.pack(fill='x', expand=True)

        self.canvas.create_window((0, 0), anchor='n', window=self.frame, tags='my_frame')
        self.canvas.bind("<Configure>", self.onFrameConfigure)
        self.run()

    def onFrameConfigure(self, event):
        width = event.width
        self.canvas.itemconfigure(my_frame, width=width)
        self.canvas.config(scrollregion=self.canvas.bbox("all"))

    def run(self):
        ntime = t.asctime(t.gmtime())
        n = tk.Label(self.frame, text=ntime, anchor="nw", justify='left')
        n.config(bg="black", fg="white", font=("Courier", 12))
        n.pack(fill='both', expand=True, padx=0)
        self.after(800, self.run)


if __name__ == "__main__":
    App().mainloop()

Обновление:

В приведенном ниже примере изменяются некоторые цвета фона и отступы, чтобы вы могли видеть, где именно находятся вещирасширение.

import tkinter as tk
import time as t


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.canvas = tk.Canvas(self, bg="black")
        self.frame = tk.Frame(self.canvas, bg='darkblue',)
        self.scrollbar = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)

        self.title("label insert and scrollbar test")
        self.geometry("900x400")

        self.scrollbar.pack(side='right', fill='y')
        self.canvas.pack(fill='x', expand=True)
        self.frame.pack(fill='both', expand=True)

        self.canvas.create_window((0, 0), anchor='n', window=self.frame, tags='my_frame')
        self.canvas.bind("<Configure>", self.on_canvas_configure)
        self.run()

    def on_canvas_configure(self, event):
        self.canvas.itemconfigure("my_frame", width=event.width, height=event.height)
        self.canvas.config(scrollregion=self.canvas.bbox("all"))

    def run(self):
        ntime = t.asctime(t.gmtime())
        tk.Label(self.frame, bg='black', fg='white', text=ntime,
                 font=("Courier", 12)).pack(fill='both', expand=True , padx=5, pady=5)
        self.canvas.config(scrollregion=self.canvas.bbox('all'))
        self.after(800, self.run)


if __name__ == "__main__":
    App().mainloop()

Пример результатов:

enter image description here

0 голосов
/ 23 сентября 2019

Просто чтобы ответить на мой вопрос: '' 'self.canvas.pack (fill = tk.BOTH, раскрыть = 1) self.frame.pack (fill = tk.BOTH, развернуть = 1, padx = 1)' ''

Расширил бы и холст и рамку, чтобы соответствовать всему окну.Исходный код имел только fill = tk.X, который расширяется только в направлении X.По какой-то причине я мог бы поклясться в документации, в которой говорилось, что tk.X имел в виду оба направления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...