Как заставить wxFrame вести себя как модальный объект wxDialog

Предполагая, что ваша серия состоит из datetime объектов, вам необходимо использовать Series.apply. Пример -

import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*(dt.minute // 15)))

Приведенный выше пример всегда округляет до предыдущего квартала (поведение аналогично функции пола).

РЕДАКТИРОВАТЬ

Округлить до правильного четверть часа (например, если его 7 минут 30 секунд после предыдущего квартала показать следующий квартал). Мы можем использовать приведенный ниже пример -

import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*round((float(dt.minute) + float(dt.second)/60) / 15)))

Приведенное выше будет учитывать только самые последние секунды, если вы хотите учесть миллисекунду / микросекунду, вы можете добавить это к вышеприведенному уравнению как - (float(dt.minute) + float(dt.second)/60 + float(dt.microsecond)/60000000)

8
задан Community 23 May 2017 в 12:00
поделиться

2 ответа

На самом деле не имеет смысла "останавливать выполнение" окна, поскольку окно обрабатывает только события, которые ему отправляются, например, события мыши, клавиатуры или рисования, и игнорирует их заставит программу казаться зависшей. Что вам следует сделать, так это отключить все элементы управления в вашем фрейме, это сделает их серыми и даст пользователю понять, что с ними нельзя взаимодействовать в данный момент.

Вы также можете полностью отключить родительский фрейм вместо отключение всех элементов управления на нем. Загляните в класс wxWindowDisabler , у конструктора есть параметр для указания окна, с которым можно взаимодействовать, и все другие окна приложения будут отключены.

Если вы позже захотите выполнить вторичное программы, то вы можете использовать для этого функцию wxExecute () .

3
ответ дан 5 December 2019 в 19:02
поделиться

Я тоже искал подобное решение и придумал это решение, создать фрейм, отключить другие окна, выполнив frame.MakeModal (), и остановить запуск выполнения и цикл обработки событий после показывает фрейм, и когда фрейм закрыт, выйдите из цикла событий, например Я вот пример использования wxpython, но он должен быть похож на wxwidgets.

import wx

class ModalFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, style=wx.DEFAULT_FRAME_STYLE|wx.STAY_ON_TOP)

        btn = wx.Button(self, label="Close me")
        btn.Bind(wx.EVT_BUTTON, self.onClose)
        self.Bind(wx.EVT_CLOSE, self.onClose) # (Allows main window close to work)

    def onClose(self, event):
        self.MakeModal(False) # (Re-enables parent window)
        self.eventLoop.Exit()
        self.Destroy() # (Closes window without recursion errors)

    def ShowModal(self):
        self.MakeModal(True) # (Explicit call to MakeModal)
        self.Show()

        # now to stop execution start a event loop 
        self.eventLoop = wx.EventLoop()
        self.eventLoop.Run()


app = wx.PySimpleApp()
frame = wx.Frame(None, title="Test Modal Frame")
btn = wx.Button(frame, label="Open modal frame")

def onclick(event):
    modalFrame = ModalFrame(frame, "Modal Frame")
    modalFrame.ShowModal()
    print "i will get printed after modal close"

btn.Bind(wx.EVT_BUTTON, onclick)

frame.Show()
app.SetTopWindow(frame)
app.MainLoop()
4
ответ дан 5 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: