一、tkinter  GUI界面

二、实现功能

连接设备、设备上电、设备使能、键盘按键控制关节移动、配置关节移动速度和角度

三、python源码

  1 #coding=utf-8
2 import msvcrt
3 import threading
4 from tkinter import *
5 from tkinter import ttk
6 import tkinter as tk
7 from DucoCobot import DucoCobot
8 import math
9
10 class Display():
11 def __init__(self):
12 self.root = tk.Tk()
13 self.root.title("DUCO CORE KEYBOARD CONTROL")
14 self.dic_key = {"q": 1, "a": -1, "w": 1, "s": -1, "e": 1, "d": -1,
15 "u": 1, "j": -1, "i": 1, "k": -1, "o": 1, "l": -1}
16
17 #第一行
18 self.ip_label = Label(self.root, text="ip: ")
19 self.ip_demo = StringVar(value="192.168.12.111")
20 self.ip_field = Entry(self.root, textvariable=self.ip_demo)
21 self.ip_label.grid(row=0, column=0, padx=10, pady=10)
22 self.ip_field.grid(row=0, column=1, padx=10, sticky=W)
23 self.ip = Entry.get(self.ip_field)
24 # 第二行
25 self.port_label = Label(self.root, text="port: ")
26 self.port_demo = StringVar(value="7003")
27 self.port_field = Entry(self.root, textvariable=self.port_demo)
28 self.port_label.grid(row=1, column=0, padx=10, pady=5)
29 self.port_field.grid(row=1, column=1, padx=10, sticky=W)
30 self.port = Entry.get(self.port_field)
31 #第三行
32 self.speed_label = Label(self.root, text="joint speed: ")
33 self.speed_demo = StringVar(value="10")
34 self.speed_field = Entry(self.root, textvariable=self.speed_demo)
35 self.speed_label.grid(row=2, column=0, padx=10, pady=5)
36 self.speed_field.grid(row=2, column=1, padx=10, sticky=W)
37
38 #第四行
39 self.angle_label = Label(self.root, text="joint angle: ")
40 self.angle_demo = StringVar(value="5")
41 self.angle_field = Entry(self.root, textvariable=self.angle_demo)
42 self.angle_label.grid(row=3, column=0, padx=10, pady=5)
43 self.angle_field.grid(row=3, column=1, padx=10, sticky=W)
44
45 # 第五行
46 self.button_connect = Button(self.root, text="connect", command=self.connect_robot)
47 self.button_connect.grid(row=4, column=0, padx=10, pady=5)
48 self.button_poweron = Button(self.root, text="poweron", command=self.poweron)
49 self.button_poweron.grid(row=4, column=1, padx=10)
50 self.button_enable = Button(self.root, text="enable", command=self.enable)
51 self.button_enable.grid(row=4, column=2, padx=10)
52 self.button_speedj = Button(self.root, text="speedj", command=lambda: self.thread_it(self.speedj))
53 self.button_speedj.grid(row=4, column=3, padx=10)
54 self.button_speedl = Button(self.root, text="speedl", command=lambda: self.thread_it(self.speedl))
55 self.button_speedl.grid(row=4, column=4 ,padx=10)
56 self.button_speedj = Button(self.root, text="servoj", command=lambda: self.thread_it(self.servoj))
57 self.button_speedj.grid(row=4, column=5, padx=10)
58 self.button_speedl = Button(self.root, text="servoj_pose", command=lambda: self.thread_it(self.servoj_pose))
59 self.button_speedl.grid(row=4, column=6, padx=10)
60 #文本框
61 self.app = ttk.Frame()
62 self.app.grid(row=5, columnspan=8)
63 self.fram1 = LabelFrame(self.app, text='log')
64 self.fram1.grid(row=5, pady=10, padx=10)
65 self.win_output = Text(self.fram1)
66 self.win_output.grid(row=5, sticky=E + W + N + S, pady=10, padx=10)
67 self.scrollbar = Scrollbar(self.fram1, orient="vertical", command=self.win_output.yview)
68 self.scrollbar.grid(row=5, column=8, sticky=E, rowspan=80)
69 self.scrollbar.config(command=self.win_output.yview)
70 self.win_output.config(yscrollcommand=self.scrollbar.set)
71
72 self.root.mainloop()
73
74 def get_ip_port_open(self):
75 self.ip = Entry.get(self.ip_field)
76 self.port = Entry.get(self.port_field)
77 self.duco_cobot = DucoCobot(self.ip, self.port)
78 self.duco_cobot.open()
79
80 def connect_robot(self):
81 self.ip = Entry.get(self.ip_field)
82 self.port = Entry.get(self.port_field)
83 self.duco_cobot = DucoCobot(self.ip, self.port)
84 if self.duco_cobot.open() == 0:
85 self.write("{}:{} connect success".format(self.ip, self.port))
86
87 def poweron(self):
88 self.get_ip_port_open()
89 self.duco_cobot.power_on(True)
90 state = self.duco_cobot.get_robot_state()
91 if state[0] == 5 or 6:
92 self.write("poweron success")
93 else:
94 self.write("poweron fault")
95 self.write("get_robot_state: {}".format(state))
96
97 def enable(self):
98 self.get_ip_port_open()
99 self.duco_cobot.enable(True)
100 state = self.duco_cobot.get_robot_state()
101 if state[0] == 6:
102 self.write("enable success")
103 else:
104 self.write("enable fault")
105 self.write("get_robot_state: {}".format(state))
106
107 def speedj(self):
108 self.get_ip_port_open()
109 self.write("please press key:")
110 self.win_output.bind("<KeyPress>", self.speedj_action)
111
112 def speedj_action(self, event):
113 try:
114 self.joints_list = [0, 0, 0, 0, 0, 0]
115 self.speed = Entry.get(self.speed_field)
116 self.input_key = event.char
117 self.write(" is pressed, speedj speed is {}".format(self.speed))
118 self.key_index = list(self.dic_key.keys()).index(self.input_key) // 2
119 self.joints_list[self.key_index] += self.dic_key[self.input_key] * float(self.speed)
120 self.duco_cobot.speedj(self.joints_list, 0.8, 500, False)
121 except ValueError:
122 self.write(
123 "press fault, please press correct key(QA=joint1, WS=joint2,ED=joint3,UJ=joint4,IK=joint5,OL=joint6)")
124
125 def speedl(self):
126 self.get_ip_port_open()
127 self.write("please press key:")
128 self.win_output.bind("<KeyPress>", self.speedl_action)
129
130 def speedl_action(self, event):
131 try:
132 self.joints_list = [0, 0, 0, 0, 0, 0]
133 self.speed = Entry.get(self.speed_field)
134 self.input_key = event.char
135 self.write(" is pressed, speedl speed is {}".format(self.speed))
136 self.key_index = list(self.dic_key.keys()).index(self.input_key) // 2
137 self.joints_list[self.key_index] += self.dic_key[self.input_key] * float(self.speed)
138 self.duco_cobot.speedl(self.joints_list, 0.2, 500, False)
139 except ValueError:
140 self.write(
141 "press fault, please press correct key(QA=X, WS=Y,ED=Z,UJ=RX,IK=RY,OL=RZ)")
142
143 def servoj(self):
144 self.get_ip_port_open()
145 self.write("please press key:")
146 self.win_output.bind("<KeyPress>", self.servoj_action)
147
148 def servoj_action(self, event):
149 try:
150 position = self.duco_cobot.get_actual_joints_position()
151 self.angle = Entry.get(self.angle_field)
152 self.input_key = event.char
153 self.write(" is pressed, servoj angle is {}".format(self.angle))
154 self.key_index = list(self.dic_key.keys()).index(self.input_key) // 2
155 position[self.key_index] += self.dic_key[self.input_key] * math.radians(float(self.angle))
156 self.duco_cobot.servoj(position, 0.2, 0.4, False, 200, 25)
157 except ValueError:
158 self.write(
159 "press fault, please press correct key(QA=joint1, WS=joint2,ED=joint3,UJ=joint4,IK=joint5,OL=joint6)")
160
161 def servoj_pose(self):
162 self.get_ip_port_open()
163 self.write("please press key:")
164 self.win_output.bind("<KeyPress>", self.servoj_pose_action)
165
166 def servoj_pose_action(self, event):
167 try:
168 tcp_position = self.duco_cobot.get_tcp_pose()
169 joints_position = self.duco_cobot.get_actual_joints_position()
170 self.angle = Entry.get(self.angle_field)
171 self.input_key = event.char
172 self.write(" is pressed, servoj_pose angle is {}".format(self.angle))
173 self.key_index = list(self.dic_key.keys()).index(self.input_key) // 2
174 if self.key_index > 2:
175 tcp_position[self.key_index] += self.dic_key[self.input_key] * math.radians(float(self.angle))
176 else:
177 tcp_position[self.key_index] += self.dic_key[self.input_key] * float(self.angle) / 1000
178 self.duco_cobot.servoj_pose(tcp_position, 0.2, 0.4, joints_position, '', '', False, 200, 25)
179 except ValueError:
180 self.write(
181 "press fault, please press correct key(QA=X, WS=Y,ED=Z,UJ=RX,IK=RY,OL=RZ)")
182
183
184 def thread_it(self, func):
185 t = threading.Thread(target=func)
186 t.setDaemon(True)
187 t.start()
188
189 def write(self, txt):
190 self.win_output.insert(END, str(txt+"\n"))
191
192 if __name__ == '__main__':
193 Display()

四、程序打包

生成open.exe 文件,将其发送给未安装python的人,点击即可使用。

如果一个人不懂得照顾自己的情绪,不懂得表达自己的情绪的话,要么压抑生病,要么突然暴怒、欺负别人,因为这些情绪都没有消失,而是在生命中不断的累积。

python-GUI键盘小工具的更多相关文章

  1. Python趣味实用小工具

    代码地址如下:http://www.demodashi.com/demo/12918.html python 趣味实用小工具 概述 用python实现的三个趣味实用小工具: 图片转Execl工具 , ...

  2. Python+Tkinter 密保小工具

    上图 代码 核心 编解码方面 Tkinter界面更新 总结 昨天被一同学告知,网上的一个QQ密码库中有我的一条记录,当时我就震惊了,赶紧换了密码.当然了,这件事也给了我一个警示,那就是定期的更换自己的 ...

  3. 几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

  4. python提效小工具-统计xmind用例数量

    问题:做测试的朋友们经常会用到xmind这个工具来梳理测试点或写测试用例,但是xmind8没有自带的统计测试用例,其他版本的xmind有些自带节点数量统计功能,但也也不会累计最终的数量,导致统计测试工 ...

  5. python tkinter模块小工具界面

    代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ...

  6. 纯Python综合图像处理小工具(3)10种滤镜算法

    <背景>  滤镜处理是图像处理中一种非常常见的方法.比如photoshop中的滤镜效果,除了自带的滤镜,还扩展了很多第三方的滤镜效果插件,可以对图像做丰富多样的变换:很多手机app实现了实 ...

  7. 纯Python综合图像处理小工具(1)分通道直方图

    平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visua ...

  8. python: 实现sha1小工具

    File1: sha1.py File2: sha1.bat ------------------ File1: sha1.py import hashlib import os,sys def Ca ...

  9. 纯Python综合图像处理小工具(4)自定义像素级处理(剪纸滤镜)

      上一节介绍了python PIL库自带的10种滤镜处理,现成的库函数虽然用起来方便,但是对于图像处理的各种实际需求,还需要开发者开发自定义的滤镜算法.本文将给大家介绍如何使用PIL对图像进行自定义 ...

随机推荐

  1. 安装Zabbix到Ubuntu(APT)

    运行环境 系统版本:Ubuntu 16.04.2 LTS 软件版本:Zabbix-4.0.2 硬件要求:无 安装过程 1.安装APT-Zabbix存储库 APT-Zabbix存储库由Zabbix官网提 ...

  2. veeambackup通过虚拟机还原系统文件操作说明

    如何从 VeeamBackup Replication 从备份中提取文件恢复到本地.当我们的服务器中误操作删除了一些文件特别是共享文件,文件被删除后往往都是几个小时或者几天后才被发现.特别是文件服务器 ...

  3. ML第一周学习小结

    最近的学习内容为<Python机器学习基础教程>这本书 从第一章开始,慢慢来,比较快. 一下为我的本周机器学习小结,以及下周的Flag. 本周收获 总结一下本周学习内容: 1.了解到机器学 ...

  4. .NET C#基础(2):方法修饰符 - 给方法叠buff

    0. 文章目的   本文面向有一定.NET C#基础知识的学习者,介绍C#中的方法修饰符的含义和使用以及注意事项.   1. 阅读基础   理解C#基本语法(如方法声明)   理解OOP基本概念(如多 ...

  5. DAST 黑盒漏洞扫描器 第三篇:无害化

    0X01 前言 甲方扫描器其中一个很重要的功能重点,就是无害化,目的是尽量降低业务影响到可接受程度. 做过甲方扫描器,基本上对于反馈都有所熟悉. "我们的服务有大量报错,请问和你们有关么&q ...

  6. windiws下安装Composer

    1.先下载Composer-Setup.exe,下载地址:下载Composer .会自动搜索php.exe的安装路径,如果没有,就手动找到php路径下的php.exe. 2.在PHP目录下,打开php ...

  7. 6000字Locust入门详解

    目录 一.Locust 性能测试 (一). 性能测试工具 主流性能测试工具对比 认识Locust (二) locust 基本用法 1.安装locust 2.编写用例 3. 启动测试 GUI 模式启动 ...

  8. iOS OC纯代码企业级项目实战之我的云音乐(持续更新))

    简介 这是一个使用OC语言,从0使用纯代码方式开发一个iOS平台,接近企业级商业级的项目(我的云音乐),课程包含了基础内容,高级内容,项目封装,项目重构等知识:主要是讲解如何使用系统功能,流行的第三方 ...

  9. arcgis中栅格矢量计算技巧收藏

    ​ ​编辑 一.计算面积 ( 可以帮我们计算小班面积 )添加 AREA 字段,然后右键点击字段列,然后点击 CALCULATE VALUES; ---> 选择 ADVANCED -->把下 ...

  10. 这么强?!Erda MySQL Migrator:持续集成的数据库版本控制

    为什么要进行数据库版本控制? 现代软件工程逐渐向持续集成.持续交付演进,软件一次性交付了事的场景逐渐无法满足复杂多变的业务需求,"如何高效地进行软件版本控制"成为我们面临的挑战.同 ...