Fix, OptionsCreator: export options on Linux (#5774)

* Core/Utils: Use correct env for save_filename from AppImage

* OptionsCreator: run export on a separate thread

Running a blocking call from kivy misbehaves on Linux.
This also changes '*.yaml' to '.yaml' for Utils.save_filename,
which is the correct way to call it.

* Core/Utils: destroy Tk root after save/open_filename

This allows using those functions from multiple threads.
Note that pure Tk apps should not use those functions from Utils.

* OptionsCreator: show snack when save_filename fails

* OptionsCreator: disable window while exporting

* OptionsCreator: fixing typing of added stuff
This commit is contained in:
black-sliver
2026-02-01 21:23:14 +00:00
committed by GitHub
parent c835bff570
commit 4cb518930c
5 changed files with 142 additions and 27 deletions

82
typings/kivy/clock.pyi Normal file
View File

@@ -0,0 +1,82 @@
from _typeshed import Incomplete
from kivy._clock import (
ClockEvent as ClockEvent,
ClockNotRunningError as ClockNotRunningError,
CyClockBase as CyClockBase,
CyClockBaseFree as CyClockBaseFree,
FreeClockEvent as FreeClockEvent,
)
__all__ = [
"Clock",
"ClockNotRunningError",
"ClockEvent",
"FreeClockEvent",
"CyClockBase",
"CyClockBaseFree",
"triggered",
"ClockBaseBehavior",
"ClockBaseInterruptBehavior",
"ClockBaseInterruptFreeBehavior",
"ClockBase",
"ClockBaseInterrupt",
"ClockBaseFreeInterruptAll",
"ClockBaseFreeInterruptOnly",
"mainthread",
]
class ClockBaseBehavior:
MIN_SLEEP: float
SLEEP_UNDERSHOOT: Incomplete
def __init__(self, async_lib: str = "asyncio", **kwargs) -> None: ...
def init_async_lib(self, lib) -> None: ...
@property
def frametime(self): ...
@property
def frames(self): ...
@property
def frames_displayed(self): ...
def usleep(self, microseconds) -> None: ...
def idle(self): ...
async def async_idle(self): ...
def tick(self) -> None: ...
async def async_tick(self) -> None: ...
def pre_idle(self) -> None: ...
def post_idle(self, ts, current): ...
def tick_draw(self) -> None: ...
def get_fps(self): ...
def get_rfps(self): ...
def get_time(self): ...
def get_boottime(self): ...
time: Incomplete
def handle_exception(self, e) -> None: ...
class ClockBaseInterruptBehavior(ClockBaseBehavior):
interupt_next_only: bool
def __init__(self, interupt_next_only: bool = False, **kwargs) -> None: ...
def init_async_lib(self, lib) -> None: ...
def usleep(self, microseconds) -> None: ...
async def async_usleep(self, microseconds) -> None: ...
def on_schedule(self, event) -> None: ...
def idle(self): ...
async def async_idle(self): ...
class ClockBaseInterruptFreeBehavior(ClockBaseInterruptBehavior):
def __init__(self, **kwargs) -> None: ...
def on_schedule(self, event): ...
class ClockBase(ClockBaseBehavior, CyClockBase):
def __init__(self, **kwargs) -> None: ...
def usleep(self, microseconds) -> None: ...
class ClockBaseInterrupt(ClockBaseInterruptBehavior, CyClockBase): ...
class ClockBaseFreeInterruptAll(ClockBaseInterruptFreeBehavior, CyClockBaseFree): ...
class ClockBaseFreeInterruptOnly(ClockBaseInterruptFreeBehavior, CyClockBaseFree):
def idle(self): ...
async def async_idle(self): ...
def mainthread(func): ...
def triggered(timeout: int = 0, interval: bool = False): ...
Clock: ClockBase