【问题标题】:Simultaneous Message Boxes同步消息框
【发布时间】:2015-12-28 21:49:17
【问题描述】:

所以我创建了一个事件驱动程序,它应该在由特定事件处理程序触发时通过消息对话框提示用户。如果它们重合,是否有任何方法可以同时实例化这些消息对话框?

################################################################################
# Create Listener ##############################################################
################################################################################

# listens to a local directory for files

watch = Watcher(LOCAL_DIRECTORY, callback)

# set the appropriate flags for a listener

watch.flags = FILE_NOTIFY_CHANGE_FILE_NAME

################################################################################
# Start Listener ###############################################################
################################################################################

watch.start()

################################################################################
################################################################################
################################################################################

【问题讨论】:

  • 当然......它应该可以工作......
  • @JoranBeasley 真的没有。一个必须在另一个打开之前关闭。
  • 如果你没有提供例子......我怎么知道你做错了什么......见下面的例子......

标签: python tkinter wxpython messagebox


【解决方案1】:

它应该可以正常工作,请考虑以下事项

import wx

def handle(e):
    wx.MessageBox("Hello","world")

a = wx.App(redirect=False)
t = wx.Timer()
t.Bind(wx.EVT_TIMER,handle)
t.Start(3000)
f = wx.Frame(None)
a.MainLoop()

这将每 3 秒打开一次消息框,无论前一个是否打开...

[编辑]

经过进一步讨论,我将假设您的事件是您必须轮询的事件......您应该将轮询逻辑放在它自己的线程中

def poll_data(data_callback):
    def check_new_event():
        if do_something_to_check():
           wx.CallAfter(data_callback) # this will cause the callback to be executed in the main thread (All gui updates *should* be done in the main thread)
    while True:
       check_new_event()
       sleep(1) # force thread to surrender control for a while

def on_callback(*args,**kwargs):
    wx.MessageBox("Some Message","Title")

def my_app():
    a= wx.App(redirect=False)
    f=wx.Frame(None)
    th = threading.Thread(target=poll_data,args=(on_callback,))
    th.start()
    a.MainLoop()

[编辑 2]

在您编辑之后,我将做出另一个假设,即您的 watch 库会阻塞,直到回调返回...只需使用 wx.Callafter,如下所示

def old_callback(*args):
    wx.MessageBox("Whatever","blah")
def callback(*args):
    wx.CallAfter(old_callback,*args)

watch.bind(callback) # or however

这允许回调返回并观察以继续侦听......无论是否有阻塞对话框

[编辑 3]

这是一个使用 watch 库的完整示例

import watcher,wx
a = wx.App(redirect=False)
TARGET_DIR="/py_exp/testing"
def real_callback(*args):
    wx.MessageBox(str(args),"QQQQ")
def callback(*args):
    wx.CallAfter(real_callback,*args)
w = watcher.Watcher(TARGET_DIR, callback)
w.flags = watcher.FILE_NOTIFY_CHANGE_FILE_NAME
w.start()
f = wx.Frame(None)
a.MainLoop()

然后从目录中添加和删除文件(注意新的弹出窗口可能在现有的弹出窗口后面...但是如果您移动它们,您应该会看到所有文件)

【讨论】:

  • 没关系...如果您提供现有代码,也许我可以向您展示...
  • 你应该编辑你的问题......如果你只是发送它没有其他人从解决方案中受益......展示你如何绑定事件等你不需要发布你的完整代码......只是您当前用于触发对话框的位(以及它是如何触发的(例如,您如何接收事件等))
  • 我做了一个假设并编辑了答案......也许这会对你有所帮助
  • 好吧,这里有 3 种方法可以做到这一点……所以如果不了解更多信息并查看一个小代码示例,我可以复制粘贴来演示该问题,我不确定我还能添加什么。 ..
  • hmmm ...文件监视库名称是什么?
猜你喜欢
  • 2019-01-30
  • 2011-12-09
  • 2019-11-02
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多