def __init__(self): GObject.GObject.__init__(self) Perspective.__init__(self, "learn", _("Learn")) self.always_on = True self.dockLocation = addUserConfigPrefix("pydock-learn.xml") self.first_run = True
def __init__(self): GObject.GObject.__init__(self) self.engines = [] self.jsonpath = addUserConfigPrefix("engines.json") try: self._engines = json.load(open(self.jsonpath)) except ValueError as err: log.warning( "engineNest: Couldn\'t read engines.json, renamed it to .bak\n%s\n%s" % (self.jsonpath, err)) os.rename(self.jsonpath, self.jsonpath + ".bak") self._engines = deepcopy(backup) except IOError as err: log.info( "engineNest: Couldn\'t open engines.json, creating a new.\n%s" % err) self._engines = deepcopy(backup) # Try to detect engines shipping .eng files on Linux (suggested by HGM on talkcess.com forum) for protocol in ("xboard", "uci"): for path in ("/usr/local/share/games/plugins", "/usr/share/games/plugins"): path = os.path.join(path, protocol) if os.path.isdir(path): for entry in os.listdir(path): ext = os.path.splitext(entry)[1] if ext == ".eng": with open(os.path.join(path, entry)) as file_handle: plugin_spec = file_handle.readline().strip() if not plugin_spec.startswith("plugin spec"): continue engine_command = file_handle.readline().strip() supported_variants = file_handle.readline( ).strip() if not supported_variants.startswith("chess"): continue new_engine = {} if engine_command.startswith( "cd " ) and engine_command.find(";") > 0: parts = engine_command.split(";") working_directory = parts[0][3:] engine_command = parts[1] new_engine[ "workingDirectory"] = working_directory find = False for engine in self._engines: if engine["name"] == engine_command: find = True break if not find: new_engine["protocol"] = protocol new_engine["name"] = engine_command self._engines.append(new_engine)
def __init__(self): GObject.GObject.__init__(self) self.engines = [] self.jsonpath = addUserConfigPrefix("engines.json") try: self._engines = json.load(open(self.jsonpath)) except ValueError as err: log.warning( "engineNest: Couldn\'t read engines.json, renamed it to .bak\n%s\n%s" % (self.jsonpath, err)) os.rename(self.jsonpath, self.jsonpath + ".bak") self._engines = deepcopy(backup) except IOError as err: log.info( "engineNest: Couldn\'t open engines.json, creating a new.\n%s" % err) self._engines = deepcopy(backup) # Try to detect engines shipping .eng files on Linux (suggested by HGM on talkcess.com forum) for protocol in ("xboard", "uci"): for path in ("/usr/local/share/games/plugins", "/usr/share/games/plugins"): path = os.path.join(path, protocol) if os.path.isdir(path): for entry in os.listdir(path): ext = os.path.splitext(entry)[1] if ext == ".eng": with open(os.path.join(path, entry)) as file_handle: plugin_spec = file_handle.readline().strip() if not plugin_spec.startswith("plugin spec"): continue engine_command = file_handle.readline().strip() supported_variants = file_handle.readline().strip() if not supported_variants.startswith("chess"): continue new_engine = {} if engine_command.startswith("cd ") and engine_command.find(";") > 0: parts = engine_command.split(";") working_directory = parts[0][3:] engine_command = parts[1] new_engine["workingDirectory"] = working_directory find = False for engine in self._engines: if engine["name"] == engine_command: find = True break if not find: new_engine["protocol"] = protocol new_engine["name"] = engine_command self._engines.append(new_engine)
def __init__ (self): GObject.__init__(self) self.engines = [] self.jsonpath = addUserConfigPrefix("engines.json") try: self._engines = json.load(open(self.jsonpath)) except ValueError, e: log.warn("engineNest: Couldn\'t read engines.json, renamed it to .bak\n%s\n" % (self.jsonpath,e)) os.rename(self.jsonpath, self.jsonpath+".bak") self._engines = deepcopy(backup)
def __init__(self): GObject.GObject.__init__(self) self.engines = [] self.jsonpath = addUserConfigPrefix("engines.json") try: self._engines = json.load(open(self.jsonpath)) except ValueError as e: log.warning( "engineNest: Couldn\'t read engines.json, renamed it to .bak\n%s" % (self.jsonpath, e)) os.rename(self.jsonpath, self.jsonpath + ".bak") self._engines = deepcopy(backup) except IOError as e: log.info( "engineNest: Couldn\'t open engines.json, creating a new.\n%s" % e) self._engines = deepcopy(backup) for protocol in ("xboard", "uci"): for path in ("/usr/local/share/games/plugins", "/usr/share/games/plugins"): path = os.path.join(path, protocol) if os.path.isdir(path): for entry in os.listdir(path): name, ext = os.path.splitext(entry) if ext == ".eng": with open(os.path.join(path, entry)) as f: plugin_spec = f.readline().strip() engine_command = f.readline().strip() new_engine = {} if engine_command.startswith( "cd " ) and engine_command.find(";") > 0: parts = engine_command.split(";") working_directory = parts[0][3:] engine_command = parts[1] new_engine[ "workingDirectory"] = working_directory find = False for engine in self._engines: if engine["name"] == engine_command: find = True break if not find: new_engine["protocol"] = protocol new_engine["name"] = engine_command self._engines.append(new_engine)
def __init__(self): GObject.GObject.__init__(self) Perspective.__init__(self, "database", _("Database")) self.widgets = gamewidget.getWidgets() self.first_run = True self.chessfile = None self.chessfiles = [] self.importer = None self.gamelists = [] self.filter_panels = [] self.opening_tree_panels = [] self.preview_panels = [] self.notebooks = {} self.page_dict = {} self.connect("chessfile_opened0", self.on_chessfile_opened0) self.dockLocation = addUserConfigPrefix("pydock-database.xml")
def __init__(self): GObject.GObject.__init__(self) Perspective.__init__(self, "games", _("Games")) self.notebooks = {} self.first_run = True self.gamewidgets = set() self.gmwidg_cids = {} self.board_cids = {} self.notify_cids = defaultdict(list) self.key2gmwidg = {} self.key2cid = {} self.dock = None self.dockAlign = None self.dockLocation = addUserConfigPrefix("pydock.xml")
def __init__ (self): GObject.__init__(self) self.backup = ET.ElementTree(fromstring(backup)) self.xmlpath = addUserConfigPrefix("engines.xml") try: self.dom = ET.ElementTree(file=self.xmlpath) c = compareVersions(self.dom.getroot().get('version', default='0'), ENGINES_XML_API_VERSION) if c == -1: log.warn("engineNest: engines.xml is outdated. It will be replaced\n") self.dom = deepcopy(self.backup) elif c == 1: raise NotImplementedError, "engines.xml is of a newer date. In order" + \ "to run this version of PyChess it must first be removed" except ParseError, e: log.warn("engineNest: %s\n" % e) self.dom = deepcopy(self.backup)
def __init__(self): GObject.__init__(self) self.backup = ET.ElementTree(fromstring(backup)) self.xmlpath = addUserConfigPrefix("engines.xml") try: self.dom = ET.ElementTree(file=self.xmlpath) c = compareVersions(self.dom.getroot().get('version', default='0'), ENGINES_XML_API_VERSION) if c == -1: log.warn( "engineNest: engines.xml is outdated. It will be replaced\n" ) self.dom = deepcopy(self.backup) elif c == 1: raise NotImplementedError, "engines.xml is of a newer date. In order" + \ "to run this version of PyChess it must first be removed" except ParseError, e: log.warn("engineNest: %s\n" % e) self.dom = deepcopy(self.backup)
def __init__(self): GObject.GObject.__init__(self) self.engines = [] self.jsonpath = addUserConfigPrefix("engines.json") try: self._engines = json.load(open(self.jsonpath)) except ValueError as e: log.warning("engineNest: Couldn't read engines.json, renamed it to .bak\n%s" % (self.jsonpath, e)) os.rename(self.jsonpath, self.jsonpath + ".bak") self._engines = deepcopy(backup) except IOError as e: log.info("engineNest: Couldn't open engines.json, creating a new.\n%s" % e) self._engines = deepcopy(backup) for protocol in ("xboard", "uci"): for path in ("/usr/local/share/games/plugins", "/usr/share/games/plugins"): path = os.path.join(path, protocol) if os.path.isdir(path): for entry in os.listdir(path): name, ext = os.path.splitext(entry) if ext == ".eng": with open(os.path.join(path, entry)) as f: plugin_spec = f.readline().strip() engine_command = f.readline().strip() new_engine = {} if engine_command.startswith("cd ") and engine_command.find(";") > 0: parts = engine_command.split(";") working_directory = parts[0][3:] engine_command = parts[1] new_engine["workingDirectory"] = working_directory find = False for engine in self._engines: if engine["name"] == engine_command: find = True break if not find: new_engine["protocol"] = protocol new_engine["name"] = engine_command self._engines.append(new_engine)
import os, atexit from pychess.System.Log import Log from ConfigParser import SafeConfigParser configParser = SafeConfigParser() from pychess.System.prefix import addUserConfigPrefix section = "General" path = addUserConfigPrefix("config") if os.path.isfile(path): configParser.readfp(open(path)) if not configParser.has_section(section): configParser.add_section(section) if not configParser.has_section(section+"_Types"): configParser.add_section(section+"_Types") atexit.register(lambda: configParser.write(open(path,"w"))) idkeyfuncs = {} conid = 0 typeEncode = { str: repr(str), unicode: repr(unicode), int: repr(int), float: repr(float), bool: repr(bool) } typeDecode = { repr(str): configParser.get, repr(unicode): configParser.get, repr(int): configParser.getint, repr(float): configParser.getfloat,
import os, atexit from pychess.compat import RawConfigParser from pychess.System.Log import log configParser = RawConfigParser() from pychess.System.prefix import addUserConfigPrefix section = "General" path = addUserConfigPrefix("config") if os.path.isfile(path): configParser.readfp(open(path)) if not configParser.has_section(section): configParser.add_section(section) atexit.register(lambda: configParser.write(open(path, "w"))) idkeyfuncs = {} conid = 0 def notify_add(key, func, args): global conid idkeyfuncs[conid] = (key, func, args) conid += 1 return conid def notify_remove(conid): del idkeyfuncs[conid]
def init_layout(self): perspective_widget = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) perspective_manager.set_perspective_widget("database", perspective_widget) self.gamelist = GameList(database.load(None)) self.switcher_panel = SwitcherPanel(self.gamelist) self.opening_tree_panel = OpeningTreePanel(self.gamelist) self.filter_panel = FilterPanel(self.gamelist) self.preview_panel = PreviewPanel(self.gamelist) self.progressbar0 = Gtk.ProgressBar(show_text=True) self.progressbar = Gtk.ProgressBar(show_text=True) self.progress_dialog = Gtk.Dialog("Import", None, 0, ( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)) self.progress_dialog.get_content_area().pack_start(self.progressbar0, True, True, 0) self.progress_dialog.get_content_area().pack_start(self.progressbar, True, True, 0) self.progress_dialog.get_content_area().show_all() perspective = perspective_manager.get_perspective("database") self.dock = PyDockTop("database", perspective) align = Gtk.Alignment() align.show() align.add(self.dock) self.dock.show() perspective_widget.pack_start(align, True, True, 0) dockLocation = addUserConfigPrefix("pydock-database.xml") docks = { "gamelist": (Gtk.Label(label="gamelist"), self.gamelist.box), "switcher": (dock_panel_tab(_("Database switcher"), "", addDataPrefix("glade/panel_docker.svg")), self.switcher_panel.alignment), "openingtree": (dock_panel_tab(_("Opening tree"), "", addDataPrefix("glade/panel_docker.svg")), self.opening_tree_panel.box), "filter": (dock_panel_tab(_("Filter"), "", addDataPrefix("glade/panel_docker.svg")), self.filter_panel.box), "preview": (dock_panel_tab(_("Preview"), "", addDataPrefix("glade/panel_docker.svg")), self.preview_panel.box), } if os.path.isfile(dockLocation): try: self.dock.loadFromXML(dockLocation, docks) except Exception as e: stringio = StringIO() traceback.print_exc(file=stringio) error = stringio.getvalue() log.error("Dock loading error: %s\n%s" % (e, error)) msg_dia = Gtk.MessageDialog(None, type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.CLOSE) msg_dia.set_markup(_( "<b><big>PyChess was unable to load your panel settings</big></b>")) msg_dia.format_secondary_text(_( "Your panel settings have been reset. If this problem repeats, \ you should report it to the developers")) msg_dia.run() msg_dia.hide() os.remove(dockLocation) for title, panel in docks.values(): title.unparent() panel.unparent() if not os.path.isfile(dockLocation): leaf = self.dock.dock(docks["gamelist"][1], CENTER, docks["gamelist"][0], "gamelist") leaf.setDockable(False) leaf.dock(docks["switcher"][1], NORTH, docks["switcher"][0], "switcher") leaf = leaf.dock(docks["filter"][1], EAST, docks["filter"][0], "filter") leaf = leaf.dock(docks["openingtree"][1], SOUTH, docks["openingtree"][0], "openingtree") leaf.dock(docks["preview"][1], SOUTH, docks["preview"][0], "preview") def unrealize(dock): dock.saveToXML(dockLocation) dock._del() self.dock.connect("unrealize", unrealize) self.dock.show_all() perspective_widget.show_all() perspective_manager.set_perspective_toolbuttons("database", [self.import_button, self.close_button]) self.switcher_panel.connect("chessfile_switched", self.on_chessfile_switched)
def __init__(self): log.debug("FICS.__init__: starting") GObject.GObject.__init__(self) Perspective.__init__(self, "fics", _("ICS")) self.dockLocation = addUserConfigPrefix("pydock-fics.xml") self.first_run = True
light_on = load_icon(16, "stock_3d-light-on", "weather-clear") light_off = load_icon(16, "stock_3d-light-off", "weather-clear-night") gtk_close = load_icon(16, "gtk-close", "window-close") media_previous = load_icon(24, "gtk-media-previous-ltr", "media-skip-backward") media_rewind = load_icon(24, "gtk-media-rewind-ltr", "media-seek-backward") media_forward = load_icon(24, "gtk-media-forward-ltr", "media-seek-forward") media_next = load_icon(24, "gtk-media-next-ltr", "media-skip-forward") media_eject = load_icon(24, "player-eject", "media-eject") path = prefix.addDataPrefix("sidepanel") postfix = "Panel.py" files = [f[:-3] for f in os.listdir(path) if f.endswith(postfix)] sidePanels = [imp.load_module(f, *imp.find_module(f, [path])) for f in files] dockLocation = addUserConfigPrefix("pydock.xml") # ############################################################################### # Initialize module variables # # ############################################################################### widgets = None def setWidgets(w): global widgets widgets = w def getWidgets(): return widgets
def _ensureReadForGameWidgets(): mainvbox = widgets["mainvbox"] if len(mainvbox.get_children()) == 3: return global background background = widgets["mainvbox"].get_children()[1] mainvbox.remove(background) # Initing headbook align = createAlignment(4, 4, 0, 4) align.set_property("yscale", 0) headbook = gtk.Notebook() headbook.set_scrollable(True) headbook.props.tab_vborder = 0 align.add(headbook) mainvbox.pack_start(align, expand=False) show_tabs(not conf.get("hideTabs", False)) # Initing center centerVBox = gtk.VBox() # The message area centerVBox.pack_start(notebooks["messageArea"], expand=False) def callback(notebook, gpointer, page_num): notebook.props.visible = notebook.get_nth_page(page_num).child.props.visible notebooks["messageArea"].connect("switch-page", callback) # The dock global dock, dockAlign dock = PyDockTop("main") dockAlign = createAlignment(4, 4, 0, 4) dockAlign.add(dock) centerVBox.pack_start(dockAlign) dockAlign.show() dock.show() dockLocation = addUserConfigPrefix("pydock.xml") for panel in sidePanels: hbox = gtk.HBox() pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(panel.__icon__, 16, 16) icon = gtk.image_new_from_pixbuf(pixbuf) label = gtk.Label(panel.__title__) label.set_size_request(0, 0) label.set_alignment(0, 1) hbox.pack_start(icon, expand=False, fill=False) hbox.pack_start(label, expand=True, fill=True) hbox.set_spacing(2) hbox.show_all() def cb(widget, x, y, keyboard_mode, tooltip, title, desc, filename): table = gtk.Table(2, 2) table.set_row_spacings(2) table.set_col_spacings(6) table.set_border_width(4) pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, 56, 56) image = gtk.image_new_from_pixbuf(pixbuf) image.set_alignment(0, 0) table.attach(image, 0, 1, 0, 2) titleLabel = gtk.Label() titleLabel.set_markup("<b>%s</b>" % title) titleLabel.set_alignment(0, 0) table.attach(titleLabel, 1, 2, 0, 1) descLabel = gtk.Label(desc) descLabel.props.wrap = True table.attach(descLabel, 1, 2, 1, 2) tooltip.set_custom(table) table.show_all() return True hbox.props.has_tooltip = True hbox.connect("query-tooltip", cb, panel.__title__, panel.__desc__, panel.__icon__) docks[panel.__name__] = (hbox, notebooks[panel.__name__]) if os.path.isfile(dockLocation): try: dock.loadFromXML(dockLocation, docks) except Exception, e: stringio = cStringIO.StringIO() traceback.print_exc(file=stringio) error = stringio.getvalue() log.error("Dock loading error: %s\n%s" % (e, error)) md = gtk.MessageDialog(widgets["window1"], type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE) md.set_markup(_("<b><big>PyChess was unable to load your panel settings</big></b>")) md.format_secondary_text( _( "Your panel settings have been reset. If this problem repeats, you should report it to the developers" ) ) md.run() md.hide() os.remove(dockLocation) for title, panel in docks.values(): title.unparent() panel.unparent()
def init_layout(self): perspective_widget = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) perspective_manager.set_perspective_widget("database", perspective_widget) self.switcher_panel = SwitcherPanel(self) self.notebooks["gamelist"] = new_notebook() self.notebooks["opening_tree"] = new_notebook() self.notebooks["filter"] = new_notebook() self.notebooks["preview"] = new_notebook() self.spinner = Gtk.Spinner() self.spinner.set_size_request(50, 50) self.progressbar0 = Gtk.ProgressBar(show_text=True) self.progressbar1 = Gtk.ProgressBar(show_text=True) mainwindow = gamewidget.getWidgets()["main_window"] self.progress_dialog = Gtk.Dialog("", mainwindow, 0, ( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)) self.progress_dialog.get_content_area().pack_start(self.spinner, True, True, 0) self.progress_dialog.get_content_area().pack_start(self.progressbar0, True, True, 0) self.progress_dialog.get_content_area().pack_start(self.progressbar1, True, True, 0) self.progress_dialog.get_content_area().show_all() self.dock = PyDockTop("database", self) align = Gtk.Alignment() align.show() align.add(self.dock) self.dock.show() perspective_widget.pack_start(align, True, True, 0) dockLocation = addUserConfigPrefix("pydock-database.xml") docks = { "gamelist": (Gtk.Label(label="gamelist"), self.notebooks["gamelist"]), "switcher": (dock_panel_tab(_("Databases"), "", addDataPrefix("glade/panel_database.svg")), self.switcher_panel.alignment), "openingtree": (dock_panel_tab(_("Openings"), "", addDataPrefix("glade/panel_book.svg")), self.notebooks["opening_tree"]), "filter": (dock_panel_tab(_("Filters"), "", addDataPrefix("glade/panel_filter.svg")), self.notebooks["filter"]), "preview": (dock_panel_tab(_("Preview"), "", addDataPrefix("glade/panel_games.svg")), self.notebooks["preview"]), } if os.path.isfile(dockLocation): try: self.dock.loadFromXML(dockLocation, docks) except Exception as e: stringio = StringIO() traceback.print_exc(file=stringio) error = stringio.getvalue() log.error("Dock loading error: %s\n%s" % (e, error)) msg_dia = Gtk.MessageDialog(None, type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.CLOSE) msg_dia.set_markup(_( "<b><big>PyChess was unable to load your panel settings</big></b>")) msg_dia.format_secondary_text(_( "Your panel settings have been reset. If this problem repeats, \ you should report it to the developers")) msg_dia.run() msg_dia.hide() os.remove(dockLocation) for title, panel in docks.values(): title.unparent() panel.unparent() if not os.path.isfile(dockLocation): leaf = self.dock.dock(docks["gamelist"][1], CENTER, docks["gamelist"][0], "gamelist") leaf.setDockable(False) leaf.dock(docks["switcher"][1], NORTH, docks["switcher"][0], "switcher") leaf = leaf.dock(docks["openingtree"][1], EAST, docks["openingtree"][0], "openingtree") leaf = leaf.dock(docks["filter"][1], CENTER, docks["filter"][0], "filter") leaf.dock(docks["preview"][1], SOUTH, docks["preview"][0], "preview") def unrealize(dock): dock.saveToXML(dockLocation) dock._del() self.dock.connect("unrealize", unrealize) self.dock.show_all() perspective_widget.show_all() perspective_manager.set_perspective_toolbuttons("database", [self.import_button, self.close_button]) self.switcher_panel.connect("chessfile_switched", self.on_chessfile_switched)
def _ensureReadForGameWidgets(): mainvbox = widgets["mainvbox"] if len(mainvbox.get_children()) == 3: return global background background = widgets["mainvbox"].get_children()[1] mainvbox.remove(background) # Initing headbook align = createAlignment(4, 4, 0, 4) align.set_property("yscale", 0) headbook = gtk.Notebook() headbook.set_scrollable(True) headbook.props.tab_vborder = 0 align.add(headbook) mainvbox.pack_start(align, expand=False) show_tabs(not conf.get("hideTabs", False)) # Initing center centerVBox = gtk.VBox() # The message area centerVBox.pack_start(notebooks["messageArea"], expand=False) def callback(notebook, gpointer, page_num): notebook.props.visible = notebook.get_nth_page( page_num).child.props.visible notebooks["messageArea"].connect("switch-page", callback) # The dock global dock, dockAlign dock = PyDockTop("main") dockAlign = createAlignment(4, 4, 0, 4) dockAlign.add(dock) centerVBox.pack_start(dockAlign) dockAlign.show() dock.show() dockLocation = addUserConfigPrefix("pydock.xml") for panel in sidePanels: hbox = gtk.HBox() pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(panel.__icon__, 16, 16) icon = gtk.image_new_from_pixbuf(pixbuf) label = gtk.Label(panel.__title__) label.set_size_request(0, 0) label.set_alignment(0, 1) hbox.pack_start(icon, expand=False, fill=False) hbox.pack_start(label, expand=True, fill=True) hbox.set_spacing(2) hbox.show_all() def cb(widget, x, y, keyboard_mode, tooltip, title, desc, filename): table = gtk.Table(2, 2) table.set_row_spacings(2) table.set_col_spacings(6) table.set_border_width(4) pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, 56, 56) image = gtk.image_new_from_pixbuf(pixbuf) image.set_alignment(0, 0) table.attach(image, 0, 1, 0, 2) titleLabel = gtk.Label() titleLabel.set_markup("<b>%s</b>" % title) titleLabel.set_alignment(0, 0) table.attach(titleLabel, 1, 2, 0, 1) descLabel = gtk.Label(desc) descLabel.props.wrap = True table.attach(descLabel, 1, 2, 1, 2) tooltip.set_custom(table) table.show_all() return True hbox.props.has_tooltip = True hbox.connect("query-tooltip", cb, panel.__title__, panel.__desc__, panel.__icon__) docks[panel.__name__] = (hbox, notebooks[panel.__name__]) if os.path.isfile(dockLocation): try: dock.loadFromXML(dockLocation, docks) except Exception, e: stringio = cStringIO.StringIO() traceback.print_exc(file=stringio) error = stringio.getvalue() log.error("Dock loading error: %s\n%s" % (e, error)) md = gtk.MessageDialog(widgets["window1"], type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE) md.set_markup( _("<b><big>PyChess was unable to load your panel settings</big></b>" )) md.format_secondary_text( _("Your panel settings have been reset. If this problem repeats, you should report it to the developers" )) md.run() md.hide() os.remove(dockLocation) for title, panel in docks.values(): title.unparent() panel.unparent()