2015-05-20 9 views
0

Я пытаюсь создать приложение GUI (только начало), но у меня возникла проблема.Кнопка не отображается при использовании пакета()

Когда я использую .pack() (который мне нужно использовать), кнопка не отображается, но если я использую .grid(), она отображается.

Это код:

class TemperaturePlotApp(tk.Frame): 

    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent) 
     self.master.title("Max Temperature") 
     self.button = Button(self, text="Browse", command=self.load_file, 
          width=10, *args, **kwargs) 
     self.button.pack(side="left", fill="both", expand=True) 

    def load_file(self): 
     fname = askopenfilename(filetypes=(("Text File", "*.txt"))) 
     if fname: 
      try: 
       print("""here it comes: self.settings["template"].set(fname)""") 
      except:      # <- naked except is a bad idea 
       showerror("Open Source File", "Failed to read file\n'%s'" % fname) 

      return 

def main(): 
    root = tk.Tk() 
    app = TemperaturePlotApp(root) 
    root.geometry("800x400") 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

Если я использую .grid(), она работает:

self.master.rowconfigure(5, weight=1) 
self.master.columnconfigure(5, weight=1) 
self.grid(sticky=W+E+N+S) 

self.button = Button(self, text="Browse", command=self.load_file, width=10) 
self.button.grid(row=1, column=0, sticky=W) 

Я должен использовать .pack(), а не в сети, так что если кто-то мог пожалуйста, объясните, что я делаю неправильно, я бы очень признателен.

Благодаря Corey

ответ

1

Ваша главная проблема заключается в том, что вы не упаковке вашего TemperaturePlotApp виджета (который является производным от Frame). Попробуйте следующий код:

... 
app = TemperaturePlotApp(root) 
app.pack() 
... 

Обратите также внимание, что вы, вероятно, импорта Tkinter следующим образом:

import tkinter as tk 

Поскольку вы наследуемых от Frame виджета с помощью:

class TemperaturePlotApp(tk.Frame): 

On с другой стороны, вы пытаетесь создать кнопку, используя:

self.button = Button(...) 

Это означает, что либо вы используете другую кнопку из другой библиотеки (например, ttk), либо у вас конфликты или что-то подобное. Возможно, вам понравится:

self.button = tk.Button(...) 
+0

Эй, спасибо, кучи для этого. Это очень ценится. Проблема в том, что мне не разрешено изменять код в или ниже метода main(), поскольку я делаю это для университета. Они также настаивают, что я использую .pack, а не .grid. Вы знаете об этом? Спасибо :) – Fishingfon

+0

@Fishingfon Теперь вы можете упаковать свой виджет непосредственно в contructor ('__init__' method) в качестве последнего оператора. Например: 'self.pack()'. – nbro

+0

Это было прекрасно! Спасибо heaps :) – Fishingfon