我正在开发一个tkinter图形用户界面,它利用一个canvas widget在背景中显示图像,并在上面显示小部件。320x240
raspberry pi屏幕.我是为这些屏幕设计GUI的新手,过去只为笔记本电脑开发过。目前的GUI是这样的。
如你所见,它太小了。我想要的是
预期的结果
我之所以把几何图形 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图像
你可以有一个背景图片,而不使用一个 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()
下面是显示每种尺寸显示内容的截图。
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