tkinter应用程序在其他屏幕中移动或通过ssh运行时不保持比例

byqmnocz  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(245)

我已经用 Tkinter . 在我的双监视器本地机器上,gui的外观与设计时一样。

但我有以下问题:
如果我将窗口移动到第二个监视器,那么主窗口中的框架不会根据新监视器的尺寸调整大小,因此gui看起来是这样的

我想这与我使用的是应用程序开放的显示器的大小有关 columnconfigure 我的相框。
screen_width = int(window.winfo_geometry().split('x', 1)[0]) tab_Digitizer.columnconfigure(0, minsize=int(0.75*screen_width), weight=80) 第二个问题是,如果我从远程机器连接( MacOSXQuartz )使用 ssh ,默认情况下会打开一个小窗口,我的gui看起来是这样的

奇怪的是,如果我最大化窗口,布局会完全混乱

因为我刚开始学习python和tkinter,可能我做错了什么,但不知道是什么。
有没有办法根据根窗口的尺寸自动调整/重缩放/收缩所有内容?
也可以对每个父对象的子对象(即框架内的小部件)执行相同的操作吗
我的代码是超级大粘贴在这里,所以我给一个链接到它https://pastebin.com/hheyj1br 但我有一个片段可能有用

import tkinter as tk
import tkinter.font

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from PIL import ImageTk, Image

import screeninfo
from screeninfo import get_monitors

import os

# Method to make Label(Widget) invisible

def hide_frame(frame):
    # This will remove the widget
    frame.grid_remove()

# Method to make Label(widget) visible

def show_frame(frame, c, r, S, pdx):
    # This will recover the widget
    frame.grid(column=c, row=r, sticky=S, ipadx=(pdx,0))

# Method to make Label(widget) visible

def show_frame_padx(frame, c, r, S, pdx):
    # This will recover the widget
    frame.grid(column=c, row=r, sticky=S, padx=(pdx,0))

def populate(frame, rows):
    '''Put in some fake data'''
    for row in range(rows):
        tk.Label(frame,
                 text = "%s" % row,
                ).grid(row=row, column=0)

        t="Blah blah blah blah blah blah blah blah %s" %row

        tk.Label(frame, text=t).grid(row    = row,
                                     column = 1,
                                     sticky = EW    
                                    )

# ____________________________________________________________________________________________

# This will be the main window

window = tk.Tk()
window.resizable(True, True)
window.attributes('-zoomed', True)
window.title("DICER daq")
default_font = tkinter.font.Font(font='TkDefaultFont')
screen_height = window.winfo_screenheight()
window.update()

screen_width  = int(window.winfo_geometry().split('x', 1)[0])
screen_height = int(window.winfo_geometry().split('x', 1)[1].split('+', 1)[0])

# ____________________________________________________________________________________________

# Upper frame

frame_logo = Frame(window, bd=10)
frame_logo.place(rely=0.0, relx=0.0, relwidth=1.0)

logo_label = tk.Label(frame_logo, text="daq", fg="red", font='Helvetica 18 bold')
logo_label.pack(anchor=W)

label_version = tk.Label(frame_logo, text="version test.0", fg="blue")
label_version.pack(side=LEFT)

# ____________________________________________________________________________________________

# Lower frame

frame_main = Frame(window)
frame_main.place(rely=0.10, relx=0.0, relwidth=1.0)

# Create a tabcontrol

tabControl = ttk.Notebook(frame_main)
tabControl.grid(column=0, row=1)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# Digitizer tab

tab_Digitizer    = ttk.Frame(tabControl)
tabControl.add(tab_Digitizer, text='   Digitizer   ')
tab_Digitizer.columnconfigure(0, minsize=int(0.75*screen_width), weight=80)
tab_Digitizer.columnconfigure(1, minsize=75,                     weight=10)
tab_Digitizer.columnconfigure(2, minsize=75,                     weight=10)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# This is to select available digitizer channels

def Digitizer_channel_selection(event):
    print ("Digitizer channel selected:", var_digitizer_channel.get() )
    pass

lbl_general_board_settings = Label(tab_Digitizer, text="Digitizer channel number", font='-weight bold')
lbl_general_board_settings.grid(column=0, row=0, sticky=W)

opt_digitizer_channel = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
var_digitizer_channel = IntVar(tab_Digitizer)
var_digitizer_channel.set(opt_digitizer_channel[0]) # default value
digitizer_channel     = OptionMenu(tab_Digitizer, var_digitizer_channel, *opt_digitizer_channel, command = Digitizer_channel_selection)
digitizer_channel.grid(column=1, row=0, sticky=NSEW)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# General board settings

lbl_general_board_registers = Label(tab_Digitizer,
                                    text  = "General board registers",
                                    font  = '-weight bold',
                                   )

lbl_general_board_registers.grid(column = 0,
                                 row    = 1,
                                 sticky = W
                                )

btn_hide_general_board_registers = Button(tab_Digitizer,
                                          text    = "Hide",
                                          font    = '-weight bold',
                                          command = lambda: hide_frame(frame_general_board_registers)
                                         )

btn_hide_general_board_registers.grid(column = 1,
                                      row    = 1,
                                      sticky = EW
                                     )

btn_show_general_board_registers = Button(tab_Digitizer,
                                          text    = "Show",
                                          font    = '-weight bold',
                                          command = lambda: show_frame_padx(frame_general_board_registers, 0, 2, EW, 0)
                                         )

btn_show_general_board_registers.grid(column = 2,
                                      row    = 1,
                                      sticky = EW
                                     )

frame_general_board_registers = Frame(tab_Digitizer
                                     )

frame_general_board_registers.columnconfigure(0, minsize=int(0.49*0.75*screen_width), weight=50)
frame_general_board_registers.columnconfigure(1, minsize=int(0.25*0.75*screen_width), weight=25)
frame_general_board_registers.columnconfigure(2, minsize=int(0.25*0.75*screen_width), weight=25)
frame_general_board_registers.config(highlightbackground="black", highlightthickness=3)

frame_general_board_registers.grid(column  = 0,
                                   row     = 2,
                                   sticky  = EW,
                                   ipadx   = 0
                                  )

populate(frame_general_board_registers, 35)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# Channel settings

lbl_channel_registers = Label(tab_Digitizer,
                              text = "Channel registers",
                              font = '-weight bold'
                             )

lbl_channel_registers.grid(column = 0,
                           row    = 3,
                           sticky = W
                          )

btn_hide_channel_registers = Button(tab_Digitizer,
                                    text="Hide",
                                    font="-weight bold",
                                    command=lambda: hide_frame(frame_channel_registers)
                                   )
btn_hide_channel_registers.grid(column = 1,
                               row     = 3,
                               sticky  = EW
                              )

btn_show_channel_registers = Button(tab_Digitizer,
                                    text    = "Show",
                                    font    = '-weight bold',
                                    command = lambda: show_frame_padx(frame_channel_registers, 0, 4, W, 0)
                                   )

btn_show_channel_registers.grid(column = 2,
                                row    = 3,
                                sticky = EW
                               )

frame_channel_registers = Frame(tab_Digitizer
                               )

frame_channel_registers.grid(column = 0,
                             row    = 4,
                             sticky = W
                            )

frame_channel_registers.columnconfigure(0, minsize=int(0.840*0.75*screen_width), weight=84)
frame_channel_registers.columnconfigure(1, minsize=int(0.075*0.75*screen_width), weight=8)
frame_channel_registers.columnconfigure(2, minsize=int(0.075*0.75*screen_width), weight=8)
frame_channel_registers.config(highlightbackground="black", highlightthickness=3)

## Channel settings - PSD

def onFrameConfigure(event):
    '''Reset the scroll region to encompass the inner frame'''
    canvas.configure(scrollregion=canvas.bbox("all"))

def handle_user_scrolling_up(event):
    canvas.yview_scroll(-5, "units")

def handle_user_scrolling_down(event):
    canvas.yview_scroll(5, "units")

def handle_scrollbar_scrolling(event):
    canvas.configure(scrollregion=canvas.bbox("all"))

lbl_PSD_channel_registers = Label(frame_channel_registers,
                                  text = "DPP-PSD registers",
                                  font = (default_font.actual(), "10", "bold")
                                 )

lbl_PSD_channel_registers.grid(column = 0,
                               row    = 3,
                               ipadx  = 20,
                               sticky = W)

btn_hide_PSD_channel_registers = Button(frame_channel_registers,
                                        text    = "Hide",
                                        font    = (default_font.actual(), "10", "bold"),
                                        command = lambda: [hide_frame(canvas), hide_frame(myscrollbar)]
                                       )

btn_hide_PSD_channel_registers.grid(column = 1,
                                    row    = 3,
                                    sticky = EW
                                   )

btn_show_PSD_channel_registers = Button(frame_channel_registers,
                                        text    = "Show",
                                        font    = (default_font.actual(), "10", "bold"),
                                        command = lambda: [show_frame_padx(canvas, 0, 4, EW, 50), show_frame_padx(myscrollbar, 1, 4, NS, 0)])

btn_show_PSD_channel_registers.grid(column = 2,
                                    row    = 3,
                                    sticky = EW
                                   )

canvas = tk.Canvas(frame_channel_registers,
                   height      = int(0.20*screen_height)
                  )

frame_PSD_channel_registers = Frame(canvas
                                   )

frame_PSD_channel_registers.grid(column = 0,
                                 row    = 0,
                                 sticky = EW
                                )

frame_PSD_channel_registers.bind("<Button-4>" , handle_user_scrolling_up)
frame_PSD_channel_registers.bind("<Button-5>" , handle_user_scrolling_down)
frame_PSD_channel_registers.bind("<Configure>", handle_scrollbar_scrolling)

myscrollbar=Scrollbar(frame_channel_registers ,orient="vertical", command=canvas.yview)
canvas.configure(scrollregion=canvas.bbox("all"))

myscrollbar.grid(column = 1,
                 row    = 4,
                 sticky = NS,
                 ipadx  = 0)

canvas.grid(column = 0,
            row    = 4,
            sticky = EW,
            padx  = (50,0))

canvas.create_window((0, 0), window=frame_PSD_channel_registers, anchor="nw")
canvas.configure(yscrollcommand=myscrollbar.set)

canvas.columnconfigure(0, minsize=int(0.90*0.84*0.75*screen_width), weight=99)
canvas.columnconfigure(1, minsize=int(0.10*0.84*0.75*screen_width), weight=1)

frame_PSD_channel_registers.columnconfigure(0, minsize=int(0.20*0.84*0.75*screen_width), weight=20)
frame_PSD_channel_registers.columnconfigure(1, minsize=int(0.10*0.84*0.75*screen_width), weight=10)
frame_PSD_channel_registers.columnconfigure(2, minsize=int(0.60*0.84*0.75*screen_width), weight=50)
frame_PSD_channel_registers.config(highlightbackground="black", highlightthickness=1)

populate(frame_PSD_channel_registers, 35)

# This keeps the window open - has to be at the end

window.mainloop()

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题