frame_txt = tkinter.Frame(window, width=350, height=200)删掉width和height后还能正常运行
时间: 2024-05-17 14:17:15 浏览: 129
是的,如果删除了`width`和`height`参数,程序也可以正常运行。这是因为,在Tkinter中,如果没有指定窗口部件的大小,它们会默认自适应其包含的内容大小。因此,你可以删除`width`和`height`参数,让窗口自动适应其内容的大小。不过,如果你需要在窗口部件中放置大量的内容,还是建议设置一个合适的大小。
相关问题
from PIL import Image import tkinter as tk def site(source, pred, names): img = Image.open(source) x1, x2 = img.size print(x1) print(x2) print(img.size) results = {} for i1 in pred: s = [] for i2 in i1.data.cpu().numpy(): s1 = [] s = list(i2) # 获取中心的(x,y)坐标 x = s[0] = float(round((s[0] + s[2]) / x1 / 2, 4)) y = s[1] = float(round((s[1] + s[3]) / x2 / 2, 4)) # 位置判断 if x < 0.5 and y < 0.5: w = "2 site" elif x < 0.5 and y > 0.5: w = "3 site" elif x > 0.5 and y > 0.5: w = "4 site" else: w = "1 site" s1.append(x) s1.append(y) s1.append(s[2] - s[0]) # 预测框的宽 s1.append(s[3] - s[1]) # 预测框的高 s1.append(names[int(s[5])]) if s[4] < 0.6: break s1.append(w) # 将信息按物体分组 if names[int(s[5])] not in results: results[names[int(s[5])]] = [] results[names[int(s[5])]].append(s1) # 创建GUI界面 window = tk.Tk() window.geometry("800x600") # 创建按钮 for name in results.keys(): tk.Label(window, text="Object " + name + ":").pack() button = tk.Button(window, text="Show " + name + " results", command=lambda name=name: show_results(results[name])) button.pack() # 创建确定按钮 confirm_button = tk.Button(window, text="Confirm and Exit", command=window.quit) confirm_button.pack() def show_results(results): # 创建子界面 win = tk.Toplevel() window.geometry("800x600") win.title("Results") # 创建表格 table = tk.Frame(win) table.pack() # 创建表头 tk.Label(table, text="x").grid(row=0, column=0) tk.Label(table, text="y").grid(row=0, column=1) tk.Label(table, text="width").grid(row=0, column=2) tk.Label(table, text="height").grid(row=0, column=3) tk.Label(table, text="class").grid(row=0, column=4) # 创建表格内容 for i, s1 in enumerate(results): tk.Label(table, text=s1[0]).grid(row=i + 1, column=0) tk.Label(table, text=s1[1]).grid(row=i + 1, column=1) tk.Label(table, text=s1[2]).grid(row=i + 1, column=2) tk.Label(table, text=s1[3]).grid(row=i + 1, column=3) tk.Label(table, text=s1[4]).grid(row=i + 1, column=4) # 创建选择按钮 select_button = tk.Button(table, text="Select", command=lambda s=s1: select_result(s)) select_button.grid(row=i + 1, column=5) # 定义选择结果函数 def select_result(result): print("Selected result:", result) window.mainloop()在这个程序的基础上,修改这个程序将控制台输出x,y,宽,高经摄像头不动机械臂动的自动手眼标定后与类别一块输出
好的,首先需要将代码中的图像读取部分修改为从摄像头中读取图像。这可以使用OpenCV库实现。修改后的代码如下:
```python
import cv2
import tkinter as tk
from PIL import Image
def site(pred, names):
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
x1, x2 = img.size
print(x1)
print(x2)
print(img.size)
results = {}
for i1 in pred:
s = []
for i2 in i1.data.cpu().numpy():
s1 = []
s = list(i2)
x = s[0] = float(round((s[0] + s[2]) / x1 / 2, 4))
y = s[1] = float(round((s[1] + s[3]) / x2 / 2, 4))
if x < 0.5 and y < 0.5:
w = "2 site"
elif x < 0.5 and y > 0.5:
w = "3 site"
elif x > 0.5 and y > 0.5:
w = "4 site"
else:
w = "1 site"
s1.append(x)
s1.append(y)
s1.append(s[2] - s[0])
s1.append(s[3] - s[1])
s1.append(names[int(s[5])])
if s[4] < 0.6:
break
s1.append(w)
if names[int(s[5])] not in results:
results[names[int(s[5])]] = []
results[names[int(s[5])]].append(s1)
cap.release()
return results
# 创建GUI界面
window = tk.Tk()
window.geometry("800x600")
# 创建按钮
def show_results(results):
win = tk.Toplevel()
win.geometry("800x600")
win.title("Results")
# 创建表格
table = tk.Frame(win)
table.pack()
# 创建表头
tk.Label(table, text="x").grid(row=0, column=0)
tk.Label(table, text="y").grid(row=0, column=1)
tk.Label(table, text="width").grid(row=0, column=2)
tk.Label(table, text="height").grid(row=0, column=3)
tk.Label(table, text="class").grid(row=0, column=4)
# 创建表格内容
for i, s1 in enumerate(results):
tk.Label(table, text=s1[0]).grid(row=i + 1, column=0)
tk.Label(table, text=s1[1]).grid(row=i + 1, column=1)
tk.Label(table, text=s1[2]).grid(row=i + 1, column=2)
tk.Label(table, text=s1[3]).grid(row=i + 1, column=3)
tk.Label(table, text=s1[4]).grid(row=i + 1, column=4)
select_button = tk.Button(table, text="Select", command=lambda s=s1: select_result(s))
select_button.grid(row=i + 1, column=5)
def select_result(result):
print("Selected result:", result)
def update_gui(pred, names):
results = site(pred, names)
# 创建按钮
for name in results.keys():
tk.Label(window, text="Object " + name + ":").pack()
button = tk.Button(window, text="Show " + name + " results", command=lambda name=name: show_results(results[name]))
button.pack()
# 创建确定按钮
confirm_button = tk.Button(window, text="Confirm and Exit", command=window.quit)
confirm_button.pack()
# 调用update_gui函数更新GUI界面
update_gui(pred, names)
window.mainloop()
```
这里我们将摄像头的读取放在了 `site` 函数中,并且在 `update_gui` 函数中调用了 `site` 函数来获取预测结果。在获取预测结果后,我们再创建按钮来显示每个类别的检测结果,并且添加了选择结果的功能。
同时,我们将 `source` 参数从函数中删除,因为我们不再需要从文件中读取图像。另外,我们将 `site` 函数的第一个参数改为 `pred`,以便更好地表达这个参数的作用。
tkinter管理信息系统
### 使用Tkinter创建管理信息系统
#### 构建基础环境
为了构建一个基于Tkinter的学生信息管理系统,首先需要导入必要的模块并初始化主窗口。这一步骤确保了应用程序有一个可视化的起点。
```python
import tkinter as tk
from tkinter import messagebox, simpledialog
```
#### 设计主界面布局
设计良好的用户界面对于任何应用都至关重要。这里定义了一个基本的窗体结构,包含了菜单栏和其他控件。
```python
class StudentManagementSystem:
def __init__(self, master):
self.master = master
self.master.title("学生信息管理系统")
# 设置窗口大小
self.master.geometry('800x600')
# 添加菜单条目
menubar = tk.Menu(self.master)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="退出", command=self.master.quit)
menubar.add_cascade(label="文件", menu=filemenu)
helpmenu = tk.Menu(menubar, tearoff=0)
helpmenu.add_command(label="关于...")
menubar.add_cascade(label="帮助", menu=helpmenu)
self.master.config(menu=menubar)
```
#### 实现功能按钮
通过添加不同的按钮可以实现对学生记录的各种操作,比如新增、编辑、删除以及查看成绩等功能。
```python
frame_buttons = tk.Frame(master)
btn_add_student = tk.Button(frame_buttons, text='添加新学生', width=25, height=3,
command=lambda: self.show_form())
btn_view_students = tk.Button(frame_buttons, text='浏览所有学生', width=25, height=3,
command=lambda: self.view_all_records())
btn_add_student.grid(row=0, column=0, padx=(10), pady=(10))
btn_view_students.grid(row=0, column=1, padx=(10), pady=(10))
frame_buttons.pack(pady=(20))
```
#### 表单输入处理逻辑
当用户点击“添加新学生”的时候会弹出一个新的表单供填写具体的信息。这些信息会被保存到内存中的列表里以便后续展示或持久化至外部存储介质上。
```python
def show_form(self):
student_info = {}
fields = ['姓名', '年龄', '性别']
entries = []
top_level = tk.Toplevel()
for idx, field in enumerate(fields):
row = tk.Frame(top_level)
lab = tk.Label(row, width=15, text=field, anchor='w')
ent = tk.Entry(row)
row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
lab.pack(side=tk.LEFT)
ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X)
entries.append((field, ent))
submit_button = tk.Button(
top_level, text='提交',
command=lambda e=entries, s=top_level: self.submit(e, s)).pack()
def submit(self, entries, window=None):
data = {entry[0]: entry[1].get() for entry in entries}
print(f'收到的数据:{data}')
if window is not None:
window.destroy()
```
#### 显示已有记录
最后实现了`view_all_records()`方法用来遍历当前已有的学生对象,并将其呈现给用户。
```python
def view_all_records(self):
records_window = tk.Toplevel()
listbox = tk.Listbox(records_window)
scrollbar = tk.Scrollbar(records_window, orient="vertical")
students_data = [
{'name': '张三', 'age': 20, 'gender': '男'},
{'name': '李四', 'age': 22, 'gender': '女'}
]
for item in students_data:
formatted_item = f"{item['name']} | 年龄: {item['age']} | 性别: {item['gender']}"
listbox.insert(tk.END, formatted_item)
listbox.configure(yscrollcommand=scrollbar.set)
scrollbar.config(command=listbox.yview)
listbox.pack(expand=True, fill=tk.BOTH)
scrollbar.pack(fill=tk.Y, side=tk.RIGHT)
```
以上代码片段展示了如何利用Python内置库Tkinter快速搭建起一套简易版的学生信息管理系统原型[^1]。此程序不仅能够满足日常教学需求下的简单录入与检索工作,同时也为进一步扩展提供了坚实的基础架构支持。
阅读全文
相关推荐















