def start(): global img, pre_pts while True: root = tk.Tk() root.withdraw() f_path = filedialog.askopenfilename() if f_path: img = cv.imread(f_path) break else: messagebox.showinfo("提示", "请选择文件!") 修改上述代码,使得打开本地文件夹不选文件或者关闭系统窗口后,点击主界面按钮仍能够触发start()函数
时间: 2023-06-26 09:05:54 浏览: 96
可以使用try-except语句来捕获用户关闭系统窗口的操作,然后在except语句块中继续循环等待用户选择文件。同时,我们可以将主界面按钮的command参数设置为start函数,这样即使用户没有选择文件或关闭了系统窗口,点击主界面按钮仍会触发start函数。
修改后的代码如下:
```python
def start():
global img, pre_pts
while True:
root = tk.Tk()
root.withdraw()
try:
f_path = filedialog.askopenfilename()
if f_path:
img = cv.imread(f_path)
break
except:
pass
# 创建主界面
root = tk.Tk()
# 设置窗口标题
root.title("文件选择器")
# 设置窗口大小
root.geometry("300x200")
# 创建按钮
btn_select = tk.Button(root, text="选择文件", command=start)
btn_select.pack(pady=20)
# 进入消息循环
root.mainloop()
```
相关问题
def start(): global img, pre_pts #count = 1 while True: root = tk.Tk() root.withdraw() f_path = filedialog.askopenfilename() if f_path: img = cv.imread(f_path) break else: messagebox.showinfo("提示", "请选择文件!") 修改上述代码,使得打开本地文件夹不选文件或者关闭系统窗口后,使得槽函数能够被重新触发
def start():
global img, pre_pts
while True:
root = tk.Tk()
root.withdraw()
f_path = filedialog.askopenfilename()
root.destroy() # 关闭窗口
if f_path:
img = cv.imread(f_path)
break
else:
messagebox.showinfo("提示", "请选择文件!")
continue # 重新触发槽函数
def start(): global img, pre_pts try: root = tk.Tk() root.withdraw() f_path = filedialog.askopenfilename() if not f_path: messagebox.showinfo('提示', '请选取有效图片') else: img = cv.imread(f_path) pre_pts = -1, -1 cv.namedWindow('picture', cv.WINDOW_NORMAL) cv.resizeWindow('picture', 256, 256) cv.moveWindow('picture', 600, 300) cv.imshow('picture', img) cv.setMouseCallback('picture', draw) cv.waitKey(0) cv.destroyAllWindows() root.destroy() except Exception as e: print("出现错误:", e)上述代码报错时,下列主界面会卡住并退出程序:class Faceshow(QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(Faceshow, self).__init__(parent) self.setupUi(self) self.main_button.clicked.connect(start) self.main_exit.clicked.connect(self.quit) def quit(self): self.close() if __name__ == '__main__': hxz = QApplication(sys.argv) ui = Faceshow() ui.show() sys.exit((hxz.exec_()))
可能是因为出现了异常,但是异常没有被捕获,导致程序直接退出。你可以在 `start()` 函数中加上异常处理,例如用 `try...except` 块包裹代码,打印出错误信息,然后使程序继续运行。这样就可以避免程序直接退出。修改后的代码如下:
```
def start():
global img, pre_pts
try:
root = tk.Tk()
root.withdraw()
f_path = filedialog.askopenfilename()
if not f_path:
messagebox.showinfo('提示', '请选取有效图片')
else:
img = cv.imread(f_path)
pre_pts = -1, -1
cv.namedWindow('picture', cv.WINDOW_NORMAL)
cv.resizeWindow('picture', 256, 256)
cv.moveWindow('picture', 600, 300)
cv.imshow('picture', img)
cv.setMouseCallback('picture', draw)
cv.waitKey(0)
cv.destroyAllWindows()
root.destroy()
except Exception as e:
print("出现错误:", e)
traceback.print_exc()
class Faceshow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Faceshow, self).__init__(parent)
self.setupUi(self)
self.main_button.clicked.connect(start)
self.main_exit.clicked.connect(self.quit)
def quit(self):
self.close()
if __name__ == '__main__':
hxz = QApplication(sys.argv)
ui = Faceshow()
ui.show()
sys.exit((hxz.exec_()))
```
这样程序就不会卡住并退出了,而是会在控制台中打印出错误信息,方便你进行调试。
阅读全文