Tkinter:通过多处理启动进程会创建不需要的新窗口

2024-05-11

我计划围绕数值模拟编写一个小型 GUI,这就是我现在使用 Tkinter 的原因。模拟应在单独的进程中从 GUI 启动。为了玩一下,我定义了一个函数 random_process 来生成成对的 randn 数字(这应该是一个真正的模拟过程)。由于该函数要在单独的进程中启动,因此两个 mp.Event 对象和一个 mp.Pipe 对象作为参数传递。 主应用程序可以使用一个事件向进程请求累积的数据,另一个事件用作“毒丸”来杀死“模拟”进程。然后使用管道来传递数据。 在主应用程序中,我使用 Tkinter 的 after 函数定期检查新数据是否到达,然后绘制它。启动和停止“模拟过程”是通过主应用程序中的按钮完成的,从中请求数据也是如此。

至少这个想法是这样的,实际上该程序运行得并不好。当我点击“开始!”时按钮用于启动模拟过程,此时会出现第二个 Tkinter 窗口,与主窗口相同。我完全不知道为什么会发生这种情况。与进程的通信也不起作用,似乎没有发送数据。在谷歌搜索解决方案时,我找到了一个 Tkinter 程序启动进程并与它们对话的工作示例,但我没有找到是什么让它在我的情况下不起作用。有人有线索吗?

顺便说一句,操作系统是 Windows-7。

干杯, 扬

import matplotlib
matplotlib.use('TkAgg')
import time
import multiprocessing as mp
import Tkinter as Tk
import numpy.random as npr
import matplotlib.figure
import matplotlib.backends.backend_tkagg as tkagg

def random_process(delay, data_request, data_in, poison):
    while not poison.is_set():
        time.sleep(delay)
        print("Generating pair of random numbers...")
        x,y = npr.randn(), npr.randn()
        try:
            random_process.l.append((x,y))
        except:
            random_process.l = [(x,y)]
        if data_request.is_set():
            data_request.clear()
            try:
                ll = len(random_process.l)
                if ll > 0:
                    print("Sending %d pairs to main program.." % ll)
                    data_in.send(random_process.l)
                random_process.l = []
            except:
                print("data requested, but none there.")
    # when poison event is set, clear it:
    poison.clear()

class GuiInterfaceApp:
    def __init__(self, parent):
        self.myParent = parent

        self.previewplot_container = Tk.Frame(self.myParent)
        self.f = matplotlib.figure.Figure()
        self.ax = self.f.add_subplot(111)
        self.preview_canvas = tkagg.FigureCanvasTkAgg(self.f, master=self.previewplot_container)
        self.preview_canvas.show()

        self.button_container = Tk.Frame(self.myParent)
        self.hellobutton = Tk.Button(self.button_container, text="hello!")
        self.hellobutton.config(command = self.printhello)
        self.startbutton = Tk.Button(self.button_container, text="go!")
        self.startbutton.config(command=self.run_simulation)
        self.plotbutton = Tk.Button(self.button_container, text="show!")
        self.plotbutton.config(command=self.request_data)
        self.stopbutton = Tk.Button(self.button_container, text="stop.")
        self.stopbutton.config(command=self.stop_simulation)
        self.quitbutton = Tk.Button(self.button_container, text="get me outta here!")
        self.quitbutton.config(command=self.quit_program)

        self.previewplot_container.pack(side = Tk.TOP)
        self.preview_canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
        self.button_container.pack(side = Tk.BOTTOM)
        self.hellobutton.pack(side = Tk.LEFT)
        self.startbutton.pack(side = Tk.LEFT)
        self.plotbutton.pack(side = Tk.LEFT)
        self.stopbutton.pack(side = Tk.LEFT)
        self.quitbutton.pack(side = Tk.LEFT)

        self.simulation_running = False

        self.datarequest = mp.Event()
        self.DataIn, self.DataOut = mp.Pipe()
        self.PoisonEvent = mp.Event()
        self.p = mp.Process(target = random_process, args=(1.0, self.datarequest,     self.DataIn, self.PoisonEvent))

        self.l = [] # list of received pairs to plot

        self.mytask_time = 100 # delay in ms between calls to self.mytask

    def printhello(self):
        print("hello!")

    def run_simulation(self):
        print("startbutton pressed.")
        if not self.simulation_running:
            print("starting simulation...")
            self.p.start()
            self.simulation_running = True  # attention: no error checking

    def stop_simulation(self):
        print("stop button pressed.")
        if self.simulation_running:
            print("Sending poison pill to simulation process..")
            self.PoisonEvent.set()
            self.simulation_running = False
            # todo: wait a short amount of time and check if simu stopped.

    def request_data(self):
        print("plotbutton pressed.")
        if self.simulation_running:
            print("requesting data from simulation process")
            self.datarequest.set()

    def update_plot(self):
        print("update_plot called.")
        if len(self.l) > 0:
            print("there is data to plot.")
            while len(self.l) > 0:
                x,y = self.l.pop()
                print("plotting point (%.2f, %.2f)" % (x,y))
                self.ax.plot([x], [y], '.', color='blue')
            print("drawing the hole thing..")
            self.ax.draw()
        else:
            print("nothing to draw")

    def quit_program(self):
        print("quitbutton pressed.")
        if self.simulation_running:
            print("sending poison pill to simulation process..")
            self.PoisonEvent.set()
        print("quitting mainloop..")
        self.myParent.quit()
        print("destroying root window..")
        self.myParent.destroy()

    def receive_data(self):
        if self.DataOut.poll():
            print("receiving data..")
            data =  self.DataOut.recv()
            self.l.append(data)
            self.update_plot()

    def my_tasks(self):
        self.receive_data()
        self.myParent.after(self.mytask_time, self.my_tasks)
        return

root = Tk.Tk()
myGuiInterfaceApp = GuiInterfaceApp(root)
root.after(100, myGuiInterfaceApp.my_tasks)
root.mainloop()

尝试将主要逻辑隐藏在测试代码是否正在运行或导入的后面。

if __name__ == "__main__":
    root = Tk.Tk()
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tkinter:通过多处理启动进程会创建不需要的新窗口 的相关文章

  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 从文本文件中删除特定字符

    我对 Python 和编码都很陌生 我当时正在做一个小项目 但遇到了一个问题 44 1 6 23 2 7 49 2 3 53 2 1 68 1 6 71 2 7 我只需要从每行中删除第三个和第六个字符 或者更具体地说 从整个文件中删除 字符
  • 在python中将数据库表写入文件的最快方法

    我正在尝试从数据库中提取大量数据并将其写入 csv 文件 我正在尝试找出最快的方法来做到这一点 我发现在 fetchall 的结果上运行 writerows 比下面的代码慢 40 with open filename a as f writ
  • 从 Azure ML 实验中访问 Azure Blob 存储

    Azure ML 实验提供了通过以下方式读取 CSV 文件并将其写入 Azure Blob 存储的方法 Reader and Writer模块 但是 我需要将 JSON 文件写入 blob 存储 由于没有模块可以执行此操作 因此我尝试在Ex
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • AttributeError:“模块”对象没有属性[重复]

    这个问题在这里已经有答案了 我有两个 python 模块 a py import b def hello print hello print a py print hello print b hi b py import a def hi
  • 运行 Python 单元测试,以便成功时不打印任何内容,失败时仅打印 AssertionError()

    我有一个标准单元测试格式的测试模块 class my test unittest TestCase def test 1 self tests def test 2 self tests etc 我的公司有一个专有的测试工具 它将作为命令行
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 为 fill_ Between() 段的不同颜色添加图例

    我正在创建一个 事件图 目前如下所示 但是 我不知道如何为每个颜色组添加图例 这就是目前情节的创建方式 handles dict for i channel events in enumerate channel event list fo
  • Airflow 1.9 - 无法将日志写入 s3

    我在 aws 的 kubernetes 中运行气流 1 9 我希望将日志发送到 s3 因为气流容器本身的寿命并不长 我已经阅读了描述该过程的各种线程和文档 但我仍然无法让它工作 首先是一个测试 向我证明 s3 配置和权限是有效的 这是在我们
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 如何将带有参数的Python装饰器实现为类?

    我正在尝试实现一个接受一些参数的装饰器 通常带有参数的装饰器被实现为双重嵌套闭包 如下所示 def mydecorator param1 param2 do something with params def wrapper fn def
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome

随机推荐

  • 是否可以动态导入模块?

    我有很多角度组件的导入 看起来我可以编写一个函数来简化导入 我只是不知道怎么做 但这应该很简单 进口样本 import DashboardComponent from app components dashboard dashboard c
  • 在浏览器中打开的 .mhtml 文件中填写输入

    我想对 mhtml 文件运行 e2e 测试 即填写表格 在 mhtml 文件上查看和提取数据效果非常好 但我无法填写任何内容input字段 既不是手动也不是通过木偶操作者 你可以用这个试试 mhtml 文件 https gist githu
  • 如何使用javascript通过类名更改html元素的值

    这是我用来更改 html 元素值的代码 a class classname href Vtech com This text to be chnage a 如何在页面加载瞬间更改此文本 看来你需要添加DOMContentLoaded或者把你
  • 在 Dart 中重写哈希码的好方法是什么?

    我发现自己想要覆盖对象的 hashcode 和 并且我想知道是否有最佳实践来实现依赖于多个属性的 hashcode 并且似乎有一些特定于 Dart 的注意事项 最简单的答案是将所有属性的哈希值异或在一起 这可能还不错 Dart Up 和 R
  • Android 改造参数化@Headers

    我正在使用 OAuth 每次发出请求时都需要将 OAuth 令牌放入标头中 我看到 Header注释 但是有没有办法让它参数化 以便我可以在运行时传入 这是概念 Header Authorization OAuth var api vers
  • 如何捕获生成器抛出的异常并恢复迭代?

    我有一个生成器 它将值的集合传递给方法并生成结果 调用的方法可能会返回异常 发生这种情况时 我希望异常转到调用生成器来处理异常的代码 然后继续循环生成器 为了说明这一点 下面是一个生成器的示例 它将产生1 抛出一个 Exception 然后
  • method_存在于父类php中

    我正在尝试使用 php 函数 method exists 但我需要检查该方法是否存在于对象的父类中 so class Parent public function myFunction class Child extends Parent
  • 如何在as3中不询问的情况下写入外部文件

    我有这个代码 var fileRef FileReference new FileReference fileRef save ciao coso lingua txt 在现有的 lingua txt 文件上写入 该脚本有效 但每次他保存时
  • 使用 https 的 Java Jersey RESTful Web 服务

    我是 Java EE 的新手 正在开发一个 RESTful API 其中每个 API 调用用户都会发送编码的凭据 我的问题是如何通过默认的 http 实现 https 协议并确保我的连接安全 我正在使用 Jersey Restful Web
  • php 中接口的用途是什么?

    如果我在 PHP 中定义一个接口 以及一个创建该接口实例的工厂类 有什么方法可以强制客户端代码仅使用该接口而不使用底层具体类 根据我的理解 客户也可以实际使用底层类中的任何公共函数 字段 这是一个例子
  • HTML 中按钮内的图标

    我需要在 HTML 中将小图标放在按钮内 例如 我需要在我的网站上有 facebook 按钮 在按钮内首先是 F 图标 然后是 facebook 怎么做
  • Linux命令列出所有可用命令和别名

    是否有一个 Linux 命令可以列出该终端会话的所有可用命令和别名 就好像您输入 a 并按下 Tab 键一样 但针对的是字母表中的每个字母 或者运行 别名 但也返回命令 为什么 我想运行以下命令并查看命令是否可用 ListAllComman
  • 2D 中的大量旋转

    我正在尝试使用 Bevy 0 3 并且我可以轻松使用内置转换Camera2dComponents default 这是自上而下的二维 问题在于尝试将玩家的旋转与鼠标同步 for event in evreader iter cursor m
  • Spring-data-cassandra:创建名称为“sessionFactory”的 bean 时出错,并且无法解析对 bean“cassandraTemplate”的引用

    我有一个 springboot 应用程序 在其中连接到 cassandra DB 我的 pom xml parent gt
  • 在 TFS 2012 中使用持续集成进行自动部署

    我已经为 WCF 项目设置了持续集成 并希望使用 MSBuild 参数自动将应用程序部署到远程服务器 但它没有部署 运行新的构建时 所有测试都会通过并且所有项目都会构建 但网站尚未部署 另外 我没有从构建中收到任何错误 表明出现了任何问题
  • 如果在构造函数中使用 super 调用重写方法会发生什么

    有两个班级Super1 and Sub1 超1级 public class Super1 Super1 this printThree public void printThree System out println Print Thre
  • 具有多个注释的方法上的 AspectJ 切入点

    使用加载时编织 纯 AspectJ 我们有2个注释 Time and Count 以及一些带注释的方法 Time name myMethod1Time Count name myMethod1Count public void myMeth
  • 更新或插入 MySQL Python

    如果记录已存在 我需要更新一行 如果不存在 我需要创建一个新记录 我理解 ON DUPLICATE KEY 将使用 MYSQLdb 完成此操作 但是我无法使其正常工作 我的代码如下 cursor database cursor cursor
  • 在VB.NET中获取文件修改日期

    我的文件夹中有许多文件 我需要获取最后修改日期 所以我用了 FDate IO File GetLastWriteTime FName 对于某些文件 它工作正常 但对于其他文件 我得到的日期为 1 1 1601 但是当我在 Windows 资
  • Tkinter:通过多处理启动进程会创建不需要的新窗口

    我计划围绕数值模拟编写一个小型 GUI 这就是我现在使用 Tkinter 的原因 模拟应在单独的进程中从 GUI 启动 为了玩一下 我定义了一个函数 random process 来生成成对的 randn 数字 这应该是一个真正的模拟过程