缩放tkinter项目以适应320x240的树莓派屏幕。

问题描述 投票:2回答:1

我正在开发一个tkinter图形用户界面,它利用一个canvas widget在背景中显示图像,并在上面显示小部件。320x240 raspberry pi屏幕.我是为这些屏幕设计GUI的新手,过去只为笔记本电脑开发过。目前的GUI是这样的。

"实际结果too small

如你所见,它太小了。我想要的是

预期的结果

enter image description here

我之所以把几何图形 320x240 因为我想在我的Raspberry Pi屏幕上运行这个GUI,而这个屏幕是 320x240. 然而,pi将HDMI线的输出镜像到屏幕上。HDMI输出 1280x480. 我只是需要它在树莓派的屏幕上看起来太清晰。在HDMI输出上看起来如何拉伸并不重要。

编码

#!/usr/bin/env python
try:
    import Tkinter as tk
except:
    import tkinter as tk
from PIL import Image, ImageTk


root = tk.Tk()
root.attributes('-fullscreen', True)
root.geometry("1280x480")

#Define Canvas
canvas = tk.Canvas(root, width=320, height=240)
canvas.grid(row=1,column=1)


# translates an rgb tuple of int to a tkinter friendly color code
def _from_rgb(rgb):
    return "#%02x%02x%02x" % rgb

# Called when user presses View Log button
def viewLogRaise():
    #Hide Previous Windows
    canvas.itemconfigure(logButtonWindow, state="hidden")
    canvas.itemconfigure(titleLabelWindow, state="hidden")
    #Open Closed Windows
    canvas.itemconfigure(backButtonWindow, state="normal")
    canvas.itemconfigure(logTextWindow, state="normal")
    quote = """HAMLET: To be, or not to be--that is the question:
    Whether 'tis nobler in the mind to suffer
    The slings and arrows of outrageous fortune
    Or to take arms against a sea of troubles
    And by opposing end them. To die, to sleep--
    No more--and by a sleep to say we end
    The heartache, and the thousand natural shocks
    That flesh is heir to. 'Tis a consummation
    Devoutly to be wished."""
    logText.insert(tk.END, quote)

def backToMenu():
    #Hide Previous Windows
    canvas.itemconfigure(backButtonWindow, state="hidden")
    canvas.itemconfigure(logTextWindow, state="hidden")
    #Open Closed Windows
    canvas.itemconfigure(logButtonWindow, state="normal")
    canvas.itemconfigure(titleLabelWindow, state="normal")

# Background
pathToGif = "redpoly2.jpg"
# red_background=Image.open("redBackground.gif")
backgroundImage = ImageTk.PhotoImage(file=pathToGif)
canvas.background = backgroundImage
bg = canvas.create_image(0, 0, anchor=tk.NW, image=backgroundImage)
titleLabel = tk.Label(root,fg="white", text="TEXT",borderwidth=2,relief="solid", bg=_from_rgb((239, 36, 37)), font=("Courier", 44))
titleLabelWindow = canvas.create_window(160,90,window=titleLabel)
logButton = tk.Button(root,fg="white",text="View Log",command=viewLogRaise,borderwidth=2,relief="raised",bg=_from_rgb((239, 36, 37)), font=("Courier", 22))
logButtonWindow = canvas.create_window(160,180,window=logButton)
backButton = tk.Button(root,fg="white",text="Back",command=backToMenu,borderwidth=2,relief="raised",bg=_from_rgb((239, 36, 37)))
backButtonWindow = canvas.create_window(20,227,window=backButton)
canvas.itemconfigure(backButtonWindow, state="hidden")
logText=tk.Text(root,bg="white",height=12,width=35,borderwidth=2,relief="solid")
logTextWindow = canvas.create_window(160,110,window=logText)
canvas.itemconfigure(logTextWindow, state="hidden")
root.mainloop()

我的尝试

我用的是 root.attributes('-fullscreen', True)我想这样做可以使根框架的内容与屏幕的分辨率相匹配,但是这一行只能使 tkinter 窗口变成全尺寸。

我想过调整整个GUI的大小,使其运行在 1280x480 然而,这将意味着他们将有太多的像素,pi屏幕显示。

红宝丽2图像

enter image description here

python tkinter canvas raspberry-pi resolution
1个回答
1
投票

你可以有一个背景图片,而不使用一个 Canvas 小组件,这样做将允许您使用tkinter的几何经理来放置您的小组件。我不太明白Raspberry Pi的320x240屏幕和1280x480 HDMI屏幕之间的关系。

下面的代码说明了如何显示一个背景图片和它上面的一些小部件。还有一个 Button 在你想要的两种尺寸之间切换窗口的大小。

from PIL import Image, ImageTk
try:
    import Tkinter as tk
except:
    import tkinter as tk


path_to_bkgr_img = "redpoly2.jpg"
WIN_SIZES = (320, 240), (1280, 480)


# Translates an rgb tuple of int to a tkinter friendly color code.
def _from_rgb(rgb):
    return "#%02x%02x%02x" % rgb

def change_size():
    """ Sets/changes window size to next one available in WIN_SIZES. """
    global cur_size
    cur_size = (cur_size + 1) % len(WIN_SIZES)
    config_window()

def config_window():
    """ Sets root window's title, size, and background image. """
    global background_label

    geometry = '{}x{}'.format(*WIN_SIZES[cur_size])
    root.geometry(geometry)
    root.title(geometry)

    # Resize background to fit window size.
    btn_img = background_image.resize(WIN_SIZES[cur_size], resample=Image.BICUBIC)
    btn_img = ImageTk.PhotoImage(btn_img)  # Make tkinter compatible.

    if not background_label:  # Create Label if necessary.
        background_label = tk.Label(root)
    background_label.config(image=btn_img)
    background_label.image = btn_img  # Keep reference.
    background_label.place(x=0, y=0, relwidth=1, relheight=1)


root = tk.Tk()
background_image = Image.open(path_to_bkgr_img)
background_label = None
cur_size = 0
config_window()

titleLabel = tk.Label(root, fg="white", text="TEXT", borderwidth=2, relief="solid",
                      bg=_from_rgb((239, 36, 37)), font=("Courier", 44))
titleLabel.pack(padx=5, pady=5, expand=1)

logButton = tk.Button(root, fg="white", text="Change Size", command=change_size,
                      borderwidth=2, relief="raised", bg=_from_rgb((239, 36, 37)),
                      font=("Courier", 22))
logButton.pack(padx=5, pady=5, expand=1)

root.bind_all('<KeyPress-Escape>', lambda *event: quit())  # Press Esc key to quit app.
root.mainloop()

下面是显示每种尺寸显示内容的截图。

screenshot of small window

screenshot of large window


0
投票

RPi的输出可以通过在 "设置 "中进行配置 config.txt 文件。通过引用 配置.txt视频页面 您可以将HDMI的输出设置为特定模式。在您的情况下,这可能需要自定义设置,这将在下面的描述中说明。这里的树莓派论坛内.

您可以在 config.txt 与以下配置字符串。

hdmi_cvt=<width> <height> <framerate> <aspect> <margins> <interlace> <rb>

其中:

Value       Default     Description
width       (required)  width in pixels
height      (required)  height in pixels
framerate   (required)  framerate in Hz
aspect      3           aspect ratio 1=4:3, 2=14:9, 3=16:9, 4=5:4, 5=16:10, 6=15:9
margins     0           0=margins disabled, 1=margins enabled
interlace   0           0=progressive, 1=interlaced
rb          0           0=normal, 1=reduced blanking
© www.soinside.com 2019 - 2024. All rights reserved.