1)Text控件设置长宽时,单位是字符个数,缩放是可以采用frame方式实现像素级变化;
2)复制,粘贴需要重新定义菜单,并和右键绑定;
3)窗口缩放需要绑定窗口变动事件<Configure>;
4)窗口初始化时,读取宽度值winfo_width()返回为1,需要处理。
2、源码:
代码功能主要有:
1)创建一个窗口,在屏幕中央显示,窗口内有一个Text文本框和一个按键;
2)点击按键,文本框内显示hello world;
3)在文本框内点击右键,可以出现复制粘贴菜单;
4)窗口可以拖动缩放,Text文本框同步缩放,按键同步改变位置。
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import tkinter as tk
window = tk.Tk()
window.title("窗口缩放")
#设置窗口大小,并将窗口放置在屏幕中央
width = 400
height = 400
g_screenwidth = window.winfo_screenwidth()
g_screenheight = window.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height, (g_screenwidth-width)/2, (g_screenheight-height)/2)
window.geometry(alignstr)
#设置窗口背景为白色
window.config(bg='white')
#设置窗口最小尺寸
window.minsize(width, height)
#采用frame上添加Text方式,可根据窗口进行像素级缩放
frame1 = tk.Frame(window, width=360, height=340)
frame1.pack_propagate(0)
frame1.place(x=20, y=10)
text1 = tk.Text(frame1)
text1.pack(fill="both", expand="yes")
#Text内部支持复制,粘贴
menubar = tk.Menu(window, tearoff=False)
def cut(editor, event=None):
editor.event_generate("<<Cut>>")
def copy(editor, event=None):
editor.event_generate("<<Copy>>")
def paste(editor, event=None):
editor.event_generate('<<Paste>>')
def rightKey(event, editor):
menubar.delete(0, 'end')
menubar.add_command(label='剪切',command=lambda:cut(editor))
menubar.add_command(label='复制',command=lambda:copy(editor))
menubar.add_command(label='粘贴',command=lambda:paste(editor))
menubar.post(event.x_root,event.y_root)
#绑定右键复制粘贴功能
text1.bind('<Button-3>', lambda x: rightKey(x, text1))
#测试按键
def testFunc():
text1.insert('end', "hello world\n")
text1.see('end')
text1.update()
button1 = tk.Button(window, text="测试按键", bd=1, height=1, width=7, command=testFunc)
button1.place(x=20, y=360)
save_width = width
save_height = height
#窗口尺寸调整处理函数
def WindowResize(event):
global save_width
global save_height
new_width = window.winfo_width()
new_height = window.winfo_height()
if new_width == 1 and new_height == 1:
return
if save_width != new_width or save_height != new_height:
frame1.config(width=new_width-40, height=new_height-60)
button1.place(x=20, y=new_height-40)
save_width = new_width
save_height = new_height
#绑定窗口变动事件
window.bind('<Configure>', WindowResize)
window.mainloop()
图一为正常尺寸,显示字符;
图二、右键支持复制粘贴
图三、窗口缩放后效果
python
UI 之使用
tkinter
库制作界面时实现拖动时零件跟随变化
在用
tkinter
写界面的时候,想要界面被拖动变大变小的时候,界面里面的零件(按钮、文本一类)也跟着一起变动,该怎么办呢?
可以通过在界面里面添加Frame,然后把零件都写在Frame里面,通过grid来给零件和Frame定位,注意一定要在grid里面写好sticky,这样就可以实现啦
以登录注册页面为例
首先import...
在
Python
的
Tkinter
中,可以使用以下方法让
控件
根据屏幕
大小
自适应
缩放
:
1. `place` 方法:可以使用相对或绝对的坐标来定位
控件
,通过
改变
控件
的尺寸和位置,让
控件
随
窗口
大小
改变
而自适应
缩放
。
```
python
import
tkinter
as tk
class App:
def __init__(self, master):
self.master = master
self.label = tk.Label(master, text="Hello World", font=("Arial", 12))
self.label.place(relx=0.5, rely=0.5, anchor='center')
# 使用相对坐标,将标签置于
窗口
中心
def resize(self, event):
w, h = event.width, event.height
size = int((w + h) / 30)
self.label.config(font=("Arial", size))
root = tk.Tk()
app = App(root)
root.geometry("400x300") # 设置
窗口
大小
root.bind("<Configure>", app.resize) # 监听
窗口
大小
变化
root.mainloop()
在上面的例子中,我们使用 `place` 方法将标签置于
窗口
中心,然后使用 `resize` 方法监听
窗口
大小
变化,然后根据
窗口
的宽度和高度计算出新的字体
大小
,并更新标签的字体。
2. `grid` 方法:可以使用行和列来定位
控件
,通过
改变
控件
的尺寸和位置,让
控件
随
窗口
大小
改变
而自适应
缩放
。
```
python
import
tkinter
as tk
class App:
def __init__(self, master):
self.master = master
self.label = tk.Label(master, text="Hello World", font=("Arial", 12))
self.label.grid(row=0, column=0)
# 将标签置于第一行第一列
def resize(self, event):
w, h = event.width, event.height
size = int((w + h) / 30)
self.label.config(font=("Arial", size))
root = tk.Tk()
app = App(root)
root.geometry("400x300") # 设置
窗口
大小
root.columnconfigure(0, weight=1) # 列0随
窗口
大小
改变
而自适应
root.rowconfigure(0, weight=1) # 行0随
窗口
大小
改变
而自适应
root.bind("<Configure>", app.resize) # 监听
窗口
大小
变化
root.mainloop()
在上面的例子中,我们使用 `grid` 方法将标签置于第一行第一列,然后使用 `resize` 方法监听
窗口
大小
变化,然后根据
窗口
的宽度和高度计算出新的字体
大小
,并更新标签的字体。
3. `pack` 方法:可以将
控件
放置在
窗口
的顶部、底部或中间等位置,通过
改变
控件
的尺寸和位置,让
控件
随
窗口
大小
改变
而自适应
缩放
。
```
python
import
tkinter
as tk
class App:
def __init__(self, master):
self.master = master
self.label = tk.Label(master, text="Hello World", font=("Arial", 12))
self.label.pack(fill=tk.BOTH, expand=True)
# 将标签填充整个
窗口
并自适应
大小
def resize(self, event):
w, h = event.width, event.height
size = int((w + h) / 30)
self.label.config(font=("Arial", size))
root = tk.Tk()
app = App(root)
root.bind("<Configure>", app.resize) # 监听
窗口
大小
变化
root.mainloop()
在上面的例子中,我们使用 `pack` 方法将标签填充整个
窗口
并自适应
大小
,然后使用 `resize` 方法监听
窗口
大小
变化,然后根据
窗口
的宽度和高度计算出新的字体
大小
,并更新标签的字体。
使用这些方法可以让
控件
根据屏幕
大小
自适应
缩放
,从而达到更好的用户体验。