python tk 窗口控件的综合应用,背景颜色替换

本文介绍了如何使用Python的Tkinter库创建一个基本的图形用户界面,涵盖了Label、Entry、Button、Combobox等控件的应用,以及状态切换和回调函数的实现。通过实例演示了如何设置控件属性和响应用户操作。
部署运行你感兴趣的模型镜像

包括各种简答包括https://github.com/china-testing/python-api-tesing/blob/master/practices/tk包括

包括各种简单控件段使用。参考良github的,已注明。

直接上代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# https://github.com/china-testing/python-api-tesing/blob/master/practices/tk/tk1.py
# CreateDate: 2021-08-15

import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext

win = tk.Tk()   
#得到屏幕宽度
sw = win.winfo_screenwidth()
sh = win.winfo_screenheight()
#得到屏幕高度
ww = 280
wh = 160
#窗口宽高为100
x = (sw-ww) / 2
y = (sh-wh) / 2
win.geometry("%dx%d+%d+%d" %(ww,wh,x,y))
# Add a title       
win.title("Python GUI")  

# Modify adding a Label
a_label = ttk.Label(win, text="A Label")
a_label.grid(column=0, row=0)

# Modified Button Click Function
def click_me():
    action.configure(text='Hello ' + name.get() + ' ' +
                     number_chosen.get())

# Changing our Label
ttk.Label(win, text="Enter a name:").grid(column=0, row=0)

# Adding a Textbox Entry widget
name = tk.StringVar()
name_entered = ttk.Entry(win, width=12, textvariable=name)
name_entered.grid(column=0, row=1)

# Adding a Button
action = ttk.Button(win, text="Click Me!", command=click_me)   
action.grid(column=2, row=1)                                 # <= change column to 2

# Creating three checkbuttons
ttk.Label(win, text="Choose a number:").grid(column=1, row=0)
number = tk.StringVar()
number_chosen = ttk.Combobox(win, width=12, textvariable=number, state='readonly')
number_chosen['values'] = (1, 2, 4, 42, 100)
number_chosen.grid(column=1, row=1)
number_chosen.current(3)

chVarDis = tk.IntVar()
check1 = tk.Checkbutton(win, text="Disabled", variable=chVarDis, state='disabled')
check1.select()
check1.grid(column=0, row=4, sticky=tk.W)                   

chVarUn = tk.IntVar()
check2 = tk.Checkbutton(win, text="UnChecked", variable=chVarUn)
check2.deselect()
check2.grid(column=1, row=4, sticky=tk.W)                   

chVarEn = tk.IntVar()
check3 = tk.Checkbutton(win, text="Enabled", variable=chVarEn)
check3.deselect()
check3.grid(column=2, row=4, sticky=tk.W)                     

# GUI Callback function
def checkCallback(*ignoredArgs):
    # only enable one checkbutton
    if chVarUn.get(): check3.configure(state='disabled')
    else:             check3.configure(state='normal')
    if chVarEn.get(): check2.configure(state='disabled')
    else:             check2.configure(state='normal')

# trace the state of the two checkbuttons
chVarUn.trace('w', lambda unused0, unused1, unused2 : checkCallback())    
chVarEn.trace('w', lambda unused0, unused1, unused2 : checkCallback())   


# First, we change our Radiobutton global variables into a list
colors = ["Blue", "Gold",  "Red"]   

# We have also changed the callback function to be zero-based, using the list
# instead of module-level global variables
# Radiobutton Callback
def radCall():
    radSel=radVar.get()
    win.configure(background=colors[radSel])

# create three Radiobuttons using one variable
radVar = tk.IntVar()

# Next we are selecting a non-existing index value for radVar
radVar.set(99)                                 
 
# Now we are creating all three Radiobutton widgets within one loop
for col in range(3):                             
    curRad = tk.Radiobutton(win, text=colors[col], variable=radVar,
                            value=col, command=radCall)          
    curRad.grid(column=col, row=5, sticky=tk.W)

# Using a scrolled Text control    
scr = scrolledtext.ScrolledText(win, width=30, height=3, wrap=tk.WORD)
scr.grid(column=0, columnspan=3)

name_entered.focus()      # Place cursor into name Entry

#======================
# Start GUI
#======================
win.mainloop()

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>根据用户的问题,用户想要在Tk窗口中添加背景图。结合提供的引用,有几种方法可以实现: 1. 使用Canvas创建背景图片(如引用[1]和引用[3]所示) 2. 使用Label设置背景图片(如引用[1]中在Label上设置图片,但注意引用[1]中Label用于显示小图片,而背景图是用Canvas绘制的) 由于用户明确提到Tk窗口的背景图,我们通常使用Canvas或Label来覆盖整个窗口。但Canvas更常用,因为可以方便地在上面添加其他控件。 步骤: a) 导入必要的模块(tkinter和PIL的ImageTk, Image) b) 创建Tk窗口,设置窗口大小和标题。 c) 使用Canvas创建画布,并调整到窗口大小。 d) 加载图片,调整图片大小(可选,如果图片大小与窗口不匹配,可以调整)并转换为PhotoImage对象。 e) 在Canvas上创建背景图片(使用create_image),并将画布打包(pack)或放置(place)以覆盖整个窗口。 f) 注意:PhotoImage对象需要保持引用,否则会被垃圾回收,导致图片不显示。通常将其赋值给一个实例变量或全局变量(但在函数中最好使用实例变量或全局变量,或者像引用[1]中那样,将图片对象附加到canvas对象上)。 另外,引用[3]也展示了在Canvas上添加背景图,并在上面放置按钮(使用create_window)。 因此,我们可以提供两种方法: 方法1:使用Canvas(推荐) 方法2:使用Label(也可以,但可能不方便叠加其他控件) 由于用户要求添加背景图,并且可能需要在背景上添加其他控件,所以推荐使用Canvas。 这里给出使用Canvas的方法的详细步骤和代码示例。 注意:图片路径要正确,并且需要PIL库(Pillow)支持。 代码示例: 根据引用[1]中的示例,我们可以这样写: </think> 在 Pythontkinter 中为 Tk 窗口添加背景图主要有两种常用方法,以下是根据引用内容整理的实现方案: ### 📌 方法一:使用 Canvas 组件(推荐) ```python from tkinter import * import tkinter as tk from PIL import Image, ImageTk def main(): root = Tk() root.geometry("800x600") # 设置窗口尺寸 # 创建 Canvas 画布(尺寸与窗口一致) canvas = Canvas(root, width=800, height=600) canvas.pack(fill=BOTH, expand=True) # 填充整个窗口 # 加载并设置背景图 bg_image = Image.open("background.jpg") # 图片路径 bg_image = bg_image.resize((800, 600), Image.LANCZOS) # 调整尺寸 bg_photo = ImageTk.PhotoImage(bg_image) # 在 Canvas 上绘制图像(居中显示) canvas.create_image(400, 300, image=bg_photo, anchor=CENTER) # 关键:持久化图片引用(防止被垃圾回收) canvas.bg_photo = bg_photo # 在背景图上添加其他控件(示例按钮) button = Button(root, text="点击", bg="white") canvas.create_window(400, 500, window=button) # 使用 create_window 嵌入控件 root.mainloop() if __name__ == "__main__": main() ``` **原理说明**: 1. 通过 `Canvas` 创建画布作为背景容器 2. 使用 PIL 库调整图片尺寸以适应窗口 3. `create_image()` 将图片绘制到画布中心 4. `create_window()` 在画布上嵌入其他组件[^1][^3] ### 📌 方法二:使用 Label 组件 ```python from tkinter import * from PIL import Image, ImageTk root = Tk() root.geometry("800x600") # 加载背景图 bg_image = Image.open("background.jpg") bg_image = bg_image.resize((800, 600), Image.LANCZOS) bg_photo = ImageTk.PhotoImage(bg_image) # 创建 Label 作为背景 bg_label = Label(root, image=bg_photo) bg_label.place(x=0, y=0, relwidth=1, relheight=1) # 覆盖整个窗口 # 在背景上叠加其他控件 button = Button(root, text="按钮", bg="white") button.place(x=350, y=300) root.mainloop() ``` **注意事项**: 1. 必须使用 `place()` 布局管理器确保 Label 覆盖全窗口 2. 控件需使用 `place()` 或 `grid()` 定位在背景上方[^1] 3. 同样需要持久化图片引用(如将 `bg_photo` 绑定到全局变量或组件属性) ### ⚠️ 关键要点 1. **图片引用持久化**:必须将 `PhotoImage` 对象赋值给全局变量或组件属性(如 `canvas.bg_photo`),否则会被 Python 垃圾回收导致图片消失 2. **图片格式支持**:推荐使用 PIL 库处理图片,支持 JPG/PNG/GIF 等格式 3. **控件层级**:背景组件需最先创建,其他控件叠加在其上方 4. **布局选择**: - Canvas 适合复杂界面(可精确定位) - Label 适合简单场景[^2][^3] > 示例中的 `Image.LANCZOS` 是高质量缩放过滤器,可替换为 `Image.ANTIALIAS`(PIL 旧版本)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zeroty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值