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

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

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

  1. #! /usr/bin/env python
  2. # ! -*- coding:utf-8 -*-
  3. # ====#====#====#====
  4. # HomePage:https://www.cnblogs.com/Qzzz/
  5. # FileName: *.py
  6. # ====#====#====#====
  7. from win32 import win32api, win32gui, win32print
  8. from win32.lib import win32con
  9. from win32.win32api import GetSystemMetrics
  10. import tkinter as tk
  11. from PIL import ImageGrab
  12. from tkinter import *
  13. from tkinter import filedialog, scrolledtext, messagebox
  14. import numpy as np
  15. import matplotlib
  16. import matplotlib.pyplot as plt
  17. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
  18. from PIL import Image, ImageTk
  19. matplotlib.use('TkAgg')
  20. global photo
  21. global thDim
  22. global filepath
  23. global point1, point2
  24. global afterHandler
  25. class MainWindow(Tk):
  26. def __init__(self, master=None):
  27. super().__init__(master)
  28. global photo
  29. global thDim
  30. photo = None
  31. thDim = None
  32. self.master = master
  33. self.title("DataCollect")
  34. self.state("zoomed") # 最大化设置
  35. self.pw1 = PanedWindow(self, orient=VERTICAL, sashrelief="sunken")
  36. self.pw1.pack(fill=BOTH)
  37. self.pw2 = PanedWindow(self.pw1, orient=HORIZONTAL, width=1110, height=813, sashrelief="sunken")
  38. self.fr2 = Frame(self.pw2, width=960)
  39. self.fr3 = Frame(self.pw2, width=960)
  40. self.fr3.place(x=25, y=15)
  41. self.fig = plt.figure(figsize=(9.5, 7.15))
  42. self.ax = plt.subplot(projection='3d')
  43. self.fig.add_axes(self.ax)
  44. self.canvas = FigureCanvasTkAgg(self.fig, master=self.fr3)
  45. self.canvas.draw()
  46. self.canvas.get_tk_widget().place(x=5, y=5)
  47. self.fr1 = Frame(self.pw1, width=800, height=190)
  48. self.pw1.add(self.pw2)
  49. self.pw1.add(self.fr1)
  50. self.pw2.add(self.fr2)
  51. self.pw2.add(self.fr3)
  52. self.Button_open = Button(self.fr2, text="打开图片", width=8, font=("等线", 20, "bold"), command=self.getfile)
  53. self.Button_open.place(x=130, y=740)
  54. self.Button_screen = Button(self.fr2, text="开始截图", width=8, font=("等线", 20, "bold"), command=ScreenShot)
  55. self.Button_screen.place(x=280, y=740)
  56. self.Button_add = Button(self.fr2, text="导入数据", width=8, font=("等线", 20, "bold"), command=self.saveData)
  57. self.Button_add.place(x=690, y=740)
  58. self.Button_update1 = Button(self.fr3, text="更新图像", width=8, font=("等线", 20, "bold"), command=self.draw3Dim)
  59. self.Button_update1.place(x=200, y=740)
  60. self.Button_update2 = Button(self.fr3, text="更新文档", width=8, font=("等线", 20, "bold"), command=self.getData)
  61. self.Button_update2.place(x=560, y=740)
  62. self.Pane_left = Label(self.fr2, image=photo)
  63. self.Pane_left.place(x=0, y=0)
  64. self.Pane_right = Label(self.fr3, image=thDim)
  65. self.Pane_right.place(x=0, y=0)
  66. self.Pane_down = Label(self.fr1, height=190, width=800)
  67. self.Pane_down.place(x=0, y=0)
  68. self.scroll = Scrollbar(self.Pane_down)
  69. self.layerNum = Label(self.fr2, text="预测层数:", font=('等线', 20), width=9)
  70. self.layerNum.place(x=440, y=745)
  71. self.var = StringVar()
  72. self.num = Entry(self.fr2, width=15, textvariable=self.var)
  73. self.num.place(x=570, y=752)
  74. global afterHandler
  75. afterHandler = self.after(100, self.draw3Dim)
  76. self.protocol("WM_DELETE_WINDOW", self.on_closing)
  77. # 读取文件并显示图片
  78. def getfile(self):
  79. global filepath
  80. filepath = filedialog.askopenfilename(title='选择文件', filetypes=[('BMP', '*.bmp'), ('All Files', '*')])
  81. img = Image.open(filepath)
  82. width, height = img.size
  83. img = img.resize((958, int(958 / width * height)))
  84. global photo
  85. photo = ImageTk.PhotoImage(img)
  86. self.Pane_left.configure(image=photo)
  87. self.Pane_left.image = photo
  88. def saveData(self):
  89. img = Image.open('./ScreenShot.bmp')
  90. width = img.size[0]
  91. height = img.size[1]
  92. pix = img.load()
  93. fname = open('./rgbData.txt', "a")
  94. for i in range(0, width):
  95. for j in range(0, height):
  96. fname.write(str(pix[i, j][0]) + ',' + str(pix[i, j][1]) + ',' + str(pix[i, j][2]) + ',' + str(self.num.get()) + '\n')
  97. # 读取并显示数据集
  98. def getData(self):
  99. txt = scrolledtext.ScrolledText(self.Pane_down, width=1110, height=106, font=("宋体", 10))
  100. txt.place(x=0, y=0)
  101. f = open('./rgbData.txt')
  102. s = f.read()
  103. txt.insert(END, s)
  104. scroll = Scrollbar(self.Pane_down, orient=VERTICAL, takefocus=0.5)
  105. scroll.place(relwidth=0.05, relheight=1, relx=0.9375, rely=0)
  106. scroll.config(command=txt.yview)
  107. txt.config(yscrollcommand=scroll.set)
  108. # 根据数据集绘制三维图像
  109. def draw3Dim(self):
  110. # self.ax.clear()
  111. data_path = './rgbData.txt'
  112. data = np.loadtxt(data_path, dtype=int, delimiter=',')
  113. x, y = np.split(data, (3,), axis=1)
  114. x0 = x[:, 0]
  115. y0 = x[:, 1]
  116. z0 = x[:, 2]
  117. num = y[:, 0]
  118. self.ax.set_xlim(0, 255)
  119. self.ax.set_ylim(0, 255)
  120. self.ax.set_zlim(0, 255)
  121. for i in range(len(num)):
  122. # print(num[i])
  123. if num[i] == 0:
  124. self.ax.scatter(x0[i], y0[i], z0[i], c='b')
  125. elif num[i] == 1:
  126. self.ax.scatter(x0[i], y0[i], z0[i], c='c')
  127. elif num[i] == 2:
  128. self.ax.scatter(x0[i], y0[i], z0[i], c='g')
  129. elif num[i] == 3:
  130. self.ax.scatter(x0[i], y0[i], z0[i], c='k')
  131. elif num[i] == 4:
  132. self.ax.scatter(x0[i], y0[i], z0[i], c='m')
  133. elif num[i] == 5:
  134. self.ax.scatter(x0[i], y0[i], z0[i], c='r')
  135. self.ax.set_xlabel('R')
  136. self.ax.set_ylabel('G')
  137. self.ax.set_zlabel('B')
  138. self.canvas.draw()
  139. # 关闭
  140. def on_closing(self):
  141. self.after_cancel(afterHandler)
  142. answer = messagebox.askokcancel("退出", "确定退出吗?")
  143. if answer:
  144. plt.close('all')
  145. self.destroy()
  146. else:
  147. self.after(1000, self.draw3Dim)
  148. class Box:
  149. def __init__(self):
  150. self.start_x = None
  151. self.start_y = None
  152. self.end_x = None
  153. self.end_y = None
  154. def isNone(self):
  155. return self.start_x is None or self.end_x is None
  156. def setStart(self, x, y):
  157. self.start_x = x
  158. self.start_y = y
  159. def setEnd(self, x, y):
  160. self.end_x = x
  161. self.end_y = y
  162. def box(self):
  163. lt_x = min(self.start_x, self.end_x)
  164. lt_y = min(self.start_y, self.end_y)
  165. rb_x = max(self.start_x, self.end_x)
  166. rb_y = max(self.start_y, self.end_y)
  167. return lt_x, lt_y, rb_x, rb_y
  168. def center(self):
  169. center_x = (self.start_x + self.end_x) / 2
  170. center_y = (self.start_y + self.end_y) / 2
  171. return center_x, center_y
  172. class SelectionArea:
  173. def __init__(self, canvas: tk.Canvas):
  174. self.canvas = canvas
  175. self.area_box = Box()
  176. def empty(self):
  177. return self.area_box.isNone()
  178. def setStartPoint(self, x, y):
  179. self.canvas.delete('area', 'lt_txt', 'rb_txt')
  180. self.area_box.setStart(x, y)
  181. # 开始坐标文字
  182. self.canvas.create_text(
  183. x, y - 10, text=f'({x}, {y})', fill='red', tag='lt_txt')
  184. def updateEndPoint(self, x, y):
  185. self.area_box.setEnd(x, y)
  186. self.canvas.delete('area', 'rb_txt')
  187. box_area = self.area_box.box()
  188. # 选择区域
  189. self.canvas.create_rectangle(
  190. *box_area, fill='black', outline='red', width=2, tags="area")
  191. self.canvas.create_text(
  192. x, y + 10, text=f'({x}, {y})', fill='red', tag='rb_txt')
  193. class ScreenShot():
  194. def __init__(self, scaling_factor=2):
  195. self.win = tk.Tk()
  196. # self.win.tk.call('tk', 'scaling', scaling_factor)
  197. self.width = 960
  198. self.height = 813
  199. # 无边框,没有最小化最大化关闭这几个按钮,也无法拖动这个窗体,程序的窗体在Windows系统任务栏上也消失
  200. self.win.overrideredirect(True)
  201. self.win.attributes('-alpha', 0.1)
  202. self.is_selecting = False
  203. # 绑定按 Enter 确认, Esc 退出
  204. self.win.bind('<KeyPress-Escape>', self.exit)
  205. self.win.bind('<KeyPress-Return>', self.confirmScreenShot)
  206. self.win.bind('<Button-1>', self.selectStart)
  207. self.win.bind('<ButtonRelease-1>', self.selectDone)
  208. self.win.bind('<Motion>', self.changeSelectionArea)
  209. self.canvas = tk.Canvas(self.win, width=self.width,
  210. height=self.height)
  211. self.canvas.pack()
  212. self.area = SelectionArea(self.canvas)
  213. self.win.mainloop()
  214. def exit(self, event):
  215. self.win.destroy()
  216. def clear(self):
  217. self.canvas.delete('area', 'lt_txt', 'rb_txt')
  218. self.win.attributes('-alpha', 0)
  219. def captureImage(self):
  220. if self.area.empty():
  221. return None
  222. else:
  223. box_area = [x for x in self.area.area_box.box()]
  224. self.clear()
  225. print(f'Grab: {box_area}')
  226. img = ImageGrab.grab(box_area)
  227. return img
  228. def confirmScreenShot(self, event):
  229. img = self.captureImage()
  230. if img is not None:
  231. img.show()
  232. img.save('./ScreenShot.bmp')
  233. self.win.destroy()
  234. def selectStart(self, event):
  235. self.is_selecting = True
  236. self.area.setStartPoint(event.x, event.y)
  237. # print('Select', event)
  238. def changeSelectionArea(self, event):
  239. if self.is_selecting:
  240. self.area.updateEndPoint(event.x, event.y)
  241. # print(event)
  242. def selectDone(self, event):
  243. # self.area.updateEndPoint(event.x, event.y)
  244. self.is_selecting = False
  245. if __name__ == '__main__':
  246. this_main = MainWindow()
  247. 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. 命令行配置Windows高级防火墙

    今天正好看到个帖子,询问如何通过命令行配置防火墙策略中远程IP的地址,特别是添加新的地址. 就是图中Scope里Remote IP address的地址. 第一反应就是用netsh firewall来 ...

  2. 【Spring】Spring bean中id和name的差异

    id和name都是spring 容器中中bean 的唯一标识符. id: 一个bean的唯一标识 , 命名格式必须符合XML ID属性的命名规范 name: 可以用特殊字符,并且一个bean可以用多个 ...

  3. Linux下从零开始创建lvm虚拟磁盘阵列+脚本化解决方案

    逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器.逻辑扇区管理器.逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume ...

  4. MinIO Server配置指南

    MinIO server在默认情况下会将所有配置信息存到 ${HOME}/.minio/config.json 文件中. 以下部分提供每个字段的详细说明以及如何自定义它们. 配置目录 默认的配置目录是 ...

  5. Dockerfile文件全面详解

    Docker 可以通过读取 Dockerfile 中的指令自动构建镜像.Dockerfile 是一个文本文档,其中包含了用户创建镜像的所有命令和说明. 一. 变量 变量用 $variable_name ...

  6. U盘插入电脑后图标是灰色的,打开提示“请将磁盘插入驱动器”

    问题描述: U盘插到win10电脑上后,U盘图标显示灰色,双击打开提示:请将磁盘插入驱动器,无法格式化,在U盘点右键/属性,显示为容量等为0. 解决办法如下: 1.首先要下载一个U盘芯片检测工具chi ...

  7. 第三周python作业

    import datetime mot = ["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择.", "今天星期二:\n含泪播种的人一定会笑着收." ...

  8. PHP全栈开发(八):CSS Ⅴ 超链接 style

    CSS里面有专门针对超链接的选择器,也就是他们: a:link - 正常,未访问过的链接 a:visited - 用户已访问过的链接 a:hover - 当用户鼠标放在链接上时 a:active - ...

  9. 洛谷P1714 切蛋糕(单调队列)

    先放代码...... 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e5+10,M=0x3f3f3f3f; ...

  10. GCN的原理及其代码实现

    图数据的特征性质 图像数据是一种特殊的图数据,图像数据是标准的2D网格结构图数据.图像数据的CNN卷积神经网络算法不能直接用在图数据上,原因是图数据具有以下特殊性. 节点分布不均匀:图像数据及网格数据 ...