首页 > 解决方案 > Python,在 tkinter 中选择子菜单项时在 GUI 中执行脚本?

问题描述

我对 python 中的 GUI 没有任何经验......所以,我将首先发布 GUI 代码。

from tkinter import*

def needTodo():
    #Enter your code

root = Tk()
root.title('Something')

# ******** MAIN MENU  ******** #

menu = Menu(root)
root.config(menu=menu)
root.minsize(320, 320)
root.geometry("320x320")

subMenu = Menu(menu)
menu.add_cascade(label="File", menu=subMenu)
subMenu.add_command(label="Insert Image", command=needTodo)
subMenu.add_command(label="Web Cam", command=needTodo)
subMenu.add_separator()
subMenu.add_command(label="Exit", command=needTodo)

editMenu = Menu(menu)
menu.add_cascade(label="Edit", command=editMenu)
editMenu.add_command(label="Redo", command=needTodo)

# *********** Toolbar ************ #

toolbar = Frame(root, bg="gray")

insertBar = Button(toolbar, text="Insert Image", command=needTodo)
insertBar.pack(side=LEFT, padx=2, pady=2)
printBar = Button(toolbar, text="Print", command=needTodo)
printBar.pack(side=RIGHT, padx=2, pady=2)

toolbar.pack(side=TOP, fill=X)

# ********* IMAGE BACKGROUND ************ #


canvas = Canvas(width=320, height=320, bg='white')
canvas.pack()
gif1 = PhotoImage(file='D:/Rotating_brain_colored.gif')
canvas.create_image(0, 0, image=gif1, anchor=NW)

# ********* STATUS BAR ************ #

status = Label(root, text="Preparing to do work....", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)


root.mainloop()

因此,当在子菜单中单击“网络摄像头”选项时,我希望它执行写在同一文件夹中另一个文件(main.py)中的功能。

该函数称为“TakeSnapAndSave()”,它基本上可以访问网络摄像头并在某些情况下拍摄照片。

我想将 gui.py 和 main.py 分开。我怎样才能做到这一点?

提前致谢。

main.py 代码:

import cv2
import numpy as np
import os
import matplotlib.pyplot as plt

cascade = cv2.CascadeClassifier('xcascade.xml')

def TakeSnapAndSave():
    cap = cv2.VideoCapture(0)

    num = 0
    while num<1000:
        ret, img = cap.read()
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

        cas = cascade.detectMultiScale(gray, 10, 10)
        for(x,y,w,h) in cas:
            cv2.rectangle(img,(x,y), (x+w,y+h),(255,255,0),5)
            cv2.imwrite('opencv'+str(num)+'.jpg',img)
            num = num+1
            cv2.imshow('img',img)
            cv2.waitKey(1000)
            cap.release()
            cv2.desrtoyAllWindows()
            break

TakeSnapAndSave()

标签: pythonpython-3.xtkinter

解决方案


main.py 文件中的最后一行代码是在导入文件而不是在 GUI 中选择选项时调用函数 TakeSnapAndSave。从 main.py 中删除对 TakeSnapAndSave 的调用,Nove 的建议应该有效:

subMenu.add_command(label="Web Cam", command=main.TakeSnapAndSave)

查看有关防止代码自动运行的线程:为什么 Python 在我导入它时运行我的模块,以及如何停止它?


推荐阅读