还不能够实现所有组件随分辨率自动变化

# 实现的是界面覆盖整个屏幕
from tkinter import *
import win32api, win32con # 获取屏幕的分辨率
width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN) # 设置UI界面
root = Tk()
root.geometry("%dx%d" %(width, height))
root.resizable(False, False)
root.mainloop()
# 实现的是界面最大化
from tkinter import *
root = Tk()
root.state("zoomed")
root.mainloop()

可以结合一个python任意区域截图的案例进行分析:

#! /usr/bin/env python
# ! -*- coding:utf-8 -*-
# ====#====#====#====
# HomePage:https://www.cnblogs.com/Qzzz/
# FileName: *.py
# ====#====#====#====
from win32 import win32api, win32gui, win32print
from win32.lib import win32con
from win32.win32api import GetSystemMetrics
import tkinter as tk
from PIL import ImageGrab
from tkinter import *
from tkinter import filedialog, scrolledtext, messagebox
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from PIL import Image, ImageTk
matplotlib.use('TkAgg') global photo
global thDim
global filepath
global point1, point2
global afterHandler class MainWindow(Tk):
def __init__(self, master=None):
super().__init__(master)
global photo
global thDim
photo = None
thDim = None
self.master = master
self.title("DataCollect")
self.state("zoomed") # 最大化设置
self.pw1 = PanedWindow(self, orient=VERTICAL, sashrelief="sunken")
self.pw1.pack(fill=BOTH)
self.pw2 = PanedWindow(self.pw1, orient=HORIZONTAL, width=1110, height=813, sashrelief="sunken")
self.fr2 = Frame(self.pw2, width=960)
self.fr3 = Frame(self.pw2, width=960)
self.fr3.place(x=25, y=15)
self.fig = plt.figure(figsize=(9.5, 7.15))
self.ax = plt.subplot(projection='3d')
self.fig.add_axes(self.ax)
self.canvas = FigureCanvasTkAgg(self.fig, master=self.fr3)
self.canvas.draw()
self.canvas.get_tk_widget().place(x=5, y=5)
self.fr1 = Frame(self.pw1, width=800, height=190)
self.pw1.add(self.pw2)
self.pw1.add(self.fr1)
self.pw2.add(self.fr2)
self.pw2.add(self.fr3)
self.Button_open = Button(self.fr2, text="打开图片", width=8, font=("等线", 20, "bold"), command=self.getfile)
self.Button_open.place(x=130, y=740)
self.Button_screen = Button(self.fr2, text="开始截图", width=8, font=("等线", 20, "bold"), command=ScreenShot)
self.Button_screen.place(x=280, y=740)
self.Button_add = Button(self.fr2, text="导入数据", width=8, font=("等线", 20, "bold"), command=self.saveData)
self.Button_add.place(x=690, y=740)
self.Button_update1 = Button(self.fr3, text="更新图像", width=8, font=("等线", 20, "bold"), command=self.draw3Dim)
self.Button_update1.place(x=200, y=740)
self.Button_update2 = Button(self.fr3, text="更新文档", width=8, font=("等线", 20, "bold"), command=self.getData)
self.Button_update2.place(x=560, y=740)
self.Pane_left = Label(self.fr2, image=photo)
self.Pane_left.place(x=0, y=0)
self.Pane_right = Label(self.fr3, image=thDim)
self.Pane_right.place(x=0, y=0)
self.Pane_down = Label(self.fr1, height=190, width=800)
self.Pane_down.place(x=0, y=0)
self.scroll = Scrollbar(self.Pane_down)
self.layerNum = Label(self.fr2, text="预测层数:", font=('等线', 20), width=9)
self.layerNum.place(x=440, y=745)
self.var = StringVar()
self.num = Entry(self.fr2, width=15, textvariable=self.var)
self.num.place(x=570, y=752)
global afterHandler
afterHandler = self.after(100, self.draw3Dim)
self.protocol("WM_DELETE_WINDOW", self.on_closing) # 读取文件并显示图片
def getfile(self):
global filepath
filepath = filedialog.askopenfilename(title='选择文件', filetypes=[('BMP', '*.bmp'), ('All Files', '*')])
img = Image.open(filepath)
width, height = img.size
img = img.resize((958, int(958 / width * height))) global photo
photo = ImageTk.PhotoImage(img)
self.Pane_left.configure(image=photo)
self.Pane_left.image = photo def saveData(self):
img = Image.open('./ScreenShot.bmp')
width = img.size[0]
height = img.size[1]
pix = img.load()
fname = open('./rgbData.txt', "a")
for i in range(0, width):
for j in range(0, height):
fname.write(str(pix[i, j][0]) + ',' + str(pix[i, j][1]) + ',' + str(pix[i, j][2]) + ',' + str(self.num.get()) + '\n') # 读取并显示数据集
def getData(self):
txt = scrolledtext.ScrolledText(self.Pane_down, width=1110, height=106, font=("宋体", 10))
txt.place(x=0, y=0)
f = open('./rgbData.txt')
s = f.read()
txt.insert(END, s)
scroll = Scrollbar(self.Pane_down, orient=VERTICAL, takefocus=0.5)
scroll.place(relwidth=0.05, relheight=1, relx=0.9375, rely=0)
scroll.config(command=txt.yview)
txt.config(yscrollcommand=scroll.set) # 根据数据集绘制三维图像
def draw3Dim(self):
# self.ax.clear()
data_path = './rgbData.txt'
data = np.loadtxt(data_path, dtype=int, delimiter=',')
x, y = np.split(data, (3,), axis=1)
x0 = x[:, 0]
y0 = x[:, 1]
z0 = x[:, 2]
num = y[:, 0]
self.ax.set_xlim(0, 255)
self.ax.set_ylim(0, 255)
self.ax.set_zlim(0, 255)
for i in range(len(num)):
# print(num[i])
if num[i] == 0:
self.ax.scatter(x0[i], y0[i], z0[i], c='b')
elif num[i] == 1:
self.ax.scatter(x0[i], y0[i], z0[i], c='c')
elif num[i] == 2:
self.ax.scatter(x0[i], y0[i], z0[i], c='g')
elif num[i] == 3:
self.ax.scatter(x0[i], y0[i], z0[i], c='k')
elif num[i] == 4:
self.ax.scatter(x0[i], y0[i], z0[i], c='m')
elif num[i] == 5:
self.ax.scatter(x0[i], y0[i], z0[i], c='r')
self.ax.set_xlabel('R')
self.ax.set_ylabel('G')
self.ax.set_zlabel('B')
self.canvas.draw() # 关闭
def on_closing(self):
self.after_cancel(afterHandler)
answer = messagebox.askokcancel("退出", "确定退出吗?")
if answer:
plt.close('all')
self.destroy()
else:
self.after(1000, self.draw3Dim) class Box:
def __init__(self):
self.start_x = None
self.start_y = None
self.end_x = None
self.end_y = None def isNone(self):
return self.start_x is None or self.end_x is None def setStart(self, x, y):
self.start_x = x
self.start_y = y def setEnd(self, x, y):
self.end_x = x
self.end_y = y def box(self):
lt_x = min(self.start_x, self.end_x)
lt_y = min(self.start_y, self.end_y)
rb_x = max(self.start_x, self.end_x)
rb_y = max(self.start_y, self.end_y)
return lt_x, lt_y, rb_x, rb_y def center(self):
center_x = (self.start_x + self.end_x) / 2
center_y = (self.start_y + self.end_y) / 2
return center_x, center_y class SelectionArea:
def __init__(self, canvas: tk.Canvas):
self.canvas = canvas
self.area_box = Box() def empty(self):
return self.area_box.isNone() def setStartPoint(self, x, y):
self.canvas.delete('area', 'lt_txt', 'rb_txt')
self.area_box.setStart(x, y)
# 开始坐标文字
self.canvas.create_text(
x, y - 10, text=f'({x}, {y})', fill='red', tag='lt_txt') def updateEndPoint(self, x, y):
self.area_box.setEnd(x, y)
self.canvas.delete('area', 'rb_txt')
box_area = self.area_box.box()
# 选择区域
self.canvas.create_rectangle(
*box_area, fill='black', outline='red', width=2, tags="area")
self.canvas.create_text(
x, y + 10, text=f'({x}, {y})', fill='red', tag='rb_txt') class ScreenShot():
def __init__(self, scaling_factor=2):
self.win = tk.Tk()
# self.win.tk.call('tk', 'scaling', scaling_factor)
self.width = 960
self.height = 813 # 无边框,没有最小化最大化关闭这几个按钮,也无法拖动这个窗体,程序的窗体在Windows系统任务栏上也消失
self.win.overrideredirect(True)
self.win.attributes('-alpha', 0.1) self.is_selecting = False # 绑定按 Enter 确认, Esc 退出
self.win.bind('<KeyPress-Escape>', self.exit)
self.win.bind('<KeyPress-Return>', self.confirmScreenShot)
self.win.bind('<Button-1>', self.selectStart)
self.win.bind('<ButtonRelease-1>', self.selectDone)
self.win.bind('<Motion>', self.changeSelectionArea)
self.canvas = tk.Canvas(self.win, width=self.width,
height=self.height)
self.canvas.pack()
self.area = SelectionArea(self.canvas)
self.win.mainloop() def exit(self, event):
self.win.destroy() def clear(self):
self.canvas.delete('area', 'lt_txt', 'rb_txt')
self.win.attributes('-alpha', 0) def captureImage(self):
if self.area.empty():
return None
else:
box_area = [x for x in self.area.area_box.box()]
self.clear()
print(f'Grab: {box_area}')
img = ImageGrab.grab(box_area)
return img def confirmScreenShot(self, event):
img = self.captureImage()
if img is not None:
img.show()
img.save('./ScreenShot.bmp')
self.win.destroy() def selectStart(self, event):
self.is_selecting = True
self.area.setStartPoint(event.x, event.y)
# print('Select', event) def changeSelectionArea(self, event):
if self.is_selecting:
self.area.updateEndPoint(event.x, event.y)
# print(event) def selectDone(self, event):
# self.area.updateEndPoint(event.x, event.y)
self.is_selecting = False if __name__ == '__main__':
this_main = MainWindow()
this_main.mainloop()

Tkinter根据屏幕分辨率最大化适应屏幕的更多相关文章

  1. 像素 PIXEL 图片的基本单位 像素非常小 图片是成千上万的像素组成 显示/屏幕分辨率 (DPI 屏幕分辨率)

    像素 PIXEL 图片的基本单位 像素非常小 图片是成千上万的像素组成 显示/屏幕分辨率 (DPI 屏幕分辨率) 图像分辨率 (PPI) 1920*1080是像素点长度1920个像素点 X1080个像 ...

  2. WPF 获取屏幕分辨率(获取最大宽高)等

    double x = SystemParameters.WorkArea.Width;//得到屏幕工作区域宽度 double y = SystemParameters.WorkArea.Height; ...

  3. Android 获取屏幕分辨率

    原文:Android 获取屏幕分辨率 得到一个屏幕尺寸的三种方法如下:        // 通过WindowManager获取        DisplayMetrics dm = new Displ ...

  4. 【Android 应用开发】分析各种Android设备屏幕分辨率与适配 - 使用大量真实安卓设备采集真实数据统计

    .主要是为了总结一下 对这些概念有个直观的认识; . 作者 : 万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/198 ...

  5. WPFの获取屏幕分辨率并自适应

    double x = SystemParameters.WorkArea.Width;//得到屏幕工作区域宽度 double y = SystemParameters.WorkArea.Height; ...

  6. Delphi自动适应屏幕分辨率的属性

    https://www.cnblogs.com/zhangzhifeng/category/835602.html 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设 ...

  7. delphi 窗体自适应屏幕分辨率

    delphi 窗体自适应屏幕分辨率 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得.但是,Delphi里设计的窗体并没有自动 ...

  8. C# WinForm窗体及其控件自适应各种屏幕分辨率

    C# WinForm窗体及其控件自适应各种屏幕分辨率 一.说明  我们自己编写程序的界面,会遇到各种屏幕分辨率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置 ...

  9. cocos2d-x屏幕分辨率,窗口大小总结

    这个东西很烦人,相信很多人都不理解 今天来总结一下,首先有很多概念都要事先弄得清楚明白 1.屏幕分辨率 所谓屏幕分辨率相信很多人都知道他的概念,不就是1280pxX720PX吗?不就是这种形式吗?有什 ...

  10. VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题

    VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题   在VirtualBOx虚拟机中Ubuntu 14.04设置屏幕分辨率,怎么点都没反应. 方法一:安装与你的Ubuntu-Gu ...

随机推荐

  1. mpdf导出pdf,中文符号乱码

    改源码: 打开vendor/mpdf/mpdf/src/Config/FontVariables.php 在最后一行加入: "gb" => [ 'R' => 'gb.t ...

  2. Django提交时报错

    错误描述: RuntimeError at /saveBlog You called this URL via POST, but the URL doesn't end in a slash and ...

  3. NLP新手入门指南|北大-TANGENT

    开源的学习资源:<NLP 新手入门指南>,项目作者为北京大学 TANGENT 实验室成员. 该指南主要提供了 NLP 学习入门引导.常见任务的开发实现.各大技术教程与文献的相关推荐等内容, ...

  4. k8s实际操作中的小知识点

    1.批量执行yaml文件 # 把所有要执行的yaml文件放在同一个目录下,并且切换到这个目录下 kubectl apply -f . 2.利用pod的亲和和反亲和功能把pod调度到不同的node上 亲 ...

  5. Docker 与 Containerd 并用配置

    描述: 事实上,Docker 和 Containerd 是可以同时使用的,只不过 Docker 默认使用的 Containerd 的命名空间不是 default,而是 moby,此处为了更方便我们学习 ...

  6. echarts BAR堆叠图显示百分比

    在使用echarts的堆叠图时,我们鼠标悬停的浮窗里的信息可能并不是我们想要的信息,这个时候需要我们配置一下,因为堆叠图的trigger的类型是坐标轴触发的,数据是多组数据,所以我们需要遍历一下数据, ...

  7. 文盘Rust -- struct 中的生命周期

    最近在用rust 写一个redis的数据校验工具.redis-rs中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程.在开发中,不免要定义struct 中的 ...

  8. 【Java】Java中的零拷贝

    物理内存 计算机物理内存条的容量,比如我们买电脑会关注内存大小有多少G,这个容量就是计算机的物理内存. 虚拟内存 操作系统为每个进程分配了独立的虚拟地址空间,也就是虚拟内存,虚拟地址空间又分为用户空间 ...

  9. uoj349【WC2018】即时战略

    题目链接 WC出了点意外滚粗了,来补补题. \(O(n^2)\)的时间复杂度,\(O(nlogn)\)的询问次数应该还是比较好想的,每次要打通到x的路径,对当前已知的树不断的找重心并询问在重心的哪颗子 ...

  10. VScode将代码提交到远程服务器、同时解决每次提交都要输入密码的问题(这里以gitee为例子)

    文章目录 1.第一种情况.项目直接从gitee上拉取下来 2.第二种情况.将新建的项目提交到远程服务器 3.解决将代码提交到远程每次都要输入用户名和密码 4.个人遇到的奇葩问题 1.第一种情况.项目直 ...