Tkinter屏幕尺寸和传播

时间:2018-03-17 09:21:14

标签: python tkinter screen screen-resolution

下面的代码应该是一个大的Text窗口小部件,其中包含一个可嵌入的Text网格化的可变数量较小的Frame窗口小部件。由于Text窗口小部件高度是以行为单位测量的,我希望使用Text使内部Frame窗口小部件粘贴到sticky的垂直边框(以像素为单位)它会适应不同的显示器尺寸。

我在下面的代码中遇到两个问题。一个是屏幕分辨率。

self.winfo_screenheight()

给我一​​个72像素太高的高度 - 窗口的底部离开屏幕。我不得不手动调整它以使其适合。这与Tkinter窗口标题有关吗?我假设72个像素在监视器之间不一致。我该如何动态调整呢?

其次,我已将嵌入式Frame设置为propagate(0)但是当添加内部Text窗口小部件时,它会缩小回默认大小。如果您在中途取消注释return命令,则可以看到它在添加Text小部件之前垂直填充屏幕。我假设通过使用

嵌入Frame
self.text_box.window_create(tk.END, window = self.win_frame)

传播的window而不是Frame

有没有解决这些问题的方法。任何见解都会有所帮助。

这是代码。

import tkinter as tk
from tkinter import ttk
import tkinter.scrolledtext as St

class Main(tk.Tk):

    def __init__(self):

        tk.Tk.__init__(self)

        self.num_win = 7
        self.win_width = 40

        #Set up the root window Note the -72 hack to get it to fit
        self.screen_height = self.winfo_screenheight() - 72
        self.screen_width = self.winfo_screenwidth()
        self.geometry("{}x{}+-10+-0".format(self.screen_width, self.screen_height))
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        #Set up the mother Text widget that will hold the smaller ones
        self.vbar = ttk.Scrollbar(self, orient="horizontal")
        self.vbar.grid(column=0, row=2, sticky="EW")
        self.text_box = tk.Text(self, xscrollcommand=self.vbar.set, wrap=tk.NONE)
        self.text_box.grid(column=0, row=0, padx=(5, 5), sticky="NESW")
        self.vbar.config(command=self.text_box.xview)
        self.text_box.propagate(0)

        #Set up the Frame to grid the internal widgets to.
        self.win_frame = ttk.Frame(self.text_box, width = self.win_width * self.num_win, height =
                                   self.screen_height)
        self.win_frame.propagate(0)
        self.text_box.window_create(tk.END, window = self.win_frame)

        #return

        #Set up the internal text widgets
        self.internal_windows = []
        for n in range (0, self.num_win):
            self.internal_windows.append(St.ScrolledText(self.win_frame, width=self.win_width))
            self.internal_windows[n].grid(column=n*2, row=0, sticky="NSEW", pady=5, padx=5)
            for x in range(1, 100):
                self.internal_windows[n].insert(tk.END, "{}\n".format(x))

main = Main()

main.mainloop()

1 个答案:

答案 0 :(得分:0)

布莱恩·奥克利问你一个非常实际的问题。尽管如此,我已根据我的有限理解修改了您的脚本(见下文),您试图使用文本小部件滚动一个框架,该框架由7个并排放置的Scrolltext小部件组成,并触摸窗口标题栏。您似乎也希望框架覆盖self.text_box并且text_box具有定义的大小。

对您的脚本进行了主要修改:

  1. .propagate(0)更改为.grid_propagate(0)
  2. 将帧更改为宽度大于self.win_width * self.num_win,因为`self.win_width指的是42个字符宽,未正确用于定义帧宽。
  3. 向您展示如何配置ttk小部件的背景颜色 可视化它的实现并解决您的tkinter脚本问题。
  4. 您看到self.internal_windows中的小部件被粉红色包围,这一事实证明这些小部件是self.win_frame内的网格。

    我已将您的脚本还原为使用self.winfo_screenheight()而不是self.winfo_screenheight() -72

    旁注:为了滚动目的,我了解到人们通常会使用“tk.Canvas”。以及Scrollbar来创建Scrollable Frame。我最近为Vertical Scroll Frame编写了一个脚本,你可能会考虑修改它来进行水平滚动。

    修改后的脚本:

    import tkinter as tk
    from tkinter import ttk
    import tkinter.scrolledtext as St
    
    class Main(tk.Tk):
    
        def __init__(self):
    
            tk.Tk.__init__(self)
    
            self.num_win = 7
            self.win_width = 40
    
            self.style = ttk.Style()
            self.style.configure('frame.TFrame', background='pink', borderwidth=5,
                                 relief='raised')
    
            #Set up the root window Note the -72 hack to get it to fit
            self.screen_height = self.winfo_screenheight()
            #self.screen_height = self.winfo_screenheight() - 72
            self.screen_width = self.winfo_screenwidth()
            self.geometry("{}x{}+-10+-0".format(self.screen_width, self.screen_height))
            self.grid_rowconfigure(0, weight=1)
            self.grid_columnconfigure(0, weight=1)
            print('self.screen_height = ', self.screen_height)
            print('self.screen_width = ', self.screen_width)
    
            #Set up the mother Text widget that will hold the smaller ones
            self.hbar = ttk.Scrollbar(self, orient="horizontal")
            self.hbar.grid(column=0, row=2, sticky="EW")
            self.text_box = tk.Text(self, xscrollcommand=self.hbar.set, wrap=tk.NONE)
            self.text_box.grid(column=0, row=0, padx=(5, 5), sticky="NESW")
            self.hbar.config(command=self.text_box.xview)
            self.text_box.grid_propagate(0)
    
            #Set up the Frame to grid the internal widgets to.
            width = self.win_width * self.num_win
            print('width = ', width)
            self.win_frame = ttk.Frame(self.text_box, style='frame.TFrame',
                                       width = 310*self.num_win,
                                       #height = self.screen_height,
                                       )
            self.text_box.window_create(tk.END, window = self.win_frame)
    
            #Set up the internal text widgets
            self.internal_windows = []
            for n in range (0, self.num_win):
                self.internal_windows.append(St.ScrolledText(self.win_frame,
                                                             width=self.win_width))
                self.internal_windows[n].grid(column=n, row=0, sticky="NSEW",
                                              pady=5, padx=5)
                for x in range(1, 100):
                    self.internal_windows[n].insert(tk.END, "{}\n".format(x))
            self.win_frame.configure(height=self.screen_height)
            self.win_frame.grid_propagate(0)
    
    main = Main()
    
    main.mainloop()
    

    result