2016-04-22 2 views
0

В этом классе MainFrame у меня есть 4 кнопки, каждая из которых импортирует класс в новом окне при нажатии (кроме Update). Я могу щелкнуть каждую из кнопок один раз, но если я когда-нибудь попробую и нажму кнопку на второй раз, не появится новое окно, и ничего не произойдет вообще. Почему каждая кнопка работает только один раз?Кнопки Tkinter работают только один раз

from tkinter import * 
import tkinter.messagebox as tm 
import Users 
import re 
import sqlite3 

db = sqlite3.connect('game nebula.db') 
c = db.cursor() 


class MainFrame(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 

     self.master = master 
     self.mainUI() 

    def mainUI(self): 

     self.master.title("Games Nebula") 
     self.pack(fill=BOTH, expand=True) 

     frame1 = Frame(self) 
     frame1.pack(fill=X) 
     frame2 = Frame(self) 
     frame2.pack(fill=X) 
     frame3 = Frame(self) 
     frame3.pack(fill=X) 

     self.label_1 = Label(frame1, text="Welcome to Games Nebula!", fg='green', relief='groove', width='40') 
     self.label_1.pack(side=TOP, padx=5, pady=5) 

     self.searchbtn = Button(frame2, text="Browse Games", fg='green', command = self._search_btn_clicked) 
     self.searchbtn.pack(side=LEFT, padx=25, pady=10) 
     self.addbtn = Button(frame2, text="Add games", fg='green', command=self._addbtn_btn_clicked) 
     self.addbtn.pack(side=RIGHT, padx=25, pady=10) 
     self.updatebtn = Button(frame3, text="Update", fg='green', command=self._update_btn_clicked) 
     self.updatebtn.pack(side=LEFT, padx=40, pady=10) 
     self.deletebtn = Button(frame3, text="Delete Games", fg='green', command=self._delete_btn_clicked) 
     self.deletebtn.pack(side=RIGHT, padx=25, pady=10) 


    def _search_btn_clicked(self): 
     print("Searching") 
     import GameSearch 


    def _addbtn_btn_clicked(self): 
     import Add 

    def _update_btn_clicked(self): 
     print("Updating") 

    def _delete_btn_clicked(self): 
     import Delete 


root = Tk() 
root.geometry("300x200+300+300") 
lf = MainFrame(root) 
root.mainloop() 

ответ

1

Поскольку модули только импортируется один раз: когда модуль был импортирован, питон будет ссылаться на него, а не импортировать его снова.

Это плохая практика, так не делают это, но если вы хотите, чтобы повторно импортировать, вы можете сделать так:

import importlib 

importlib.reload(module_name) # attention: the module must have been 
           #   imported first for this to work 

я не понимаю, почему вы хотите импортировать (и повторно импортировать) модули одним нажатием кнопки.

0

Что вы на самом деле хотите сделать, так это многократно запускать код в каждом модуле. AS RB объяснил, что повторный импорт модуля не делает этого. Что вам нужно сделать, так это определенные функции и классы в модуле, которые вы можете вызвать после импорта. Если ничего другого, оберните все в функцию main и используйте, например, command=Add.main, когда вы определяете кнопку «Добавить». (Сначала положил import Add в верхней части программы.)

Тестирование модуля намного проще при импорте, оно просто определяет объекты и связывает их с именами без побочных эффектов, таких как длительные вычисления и открывающие окна.

Смежные вопросы