2016-01-24 81 views
-1

如何創建新框架並通過pyhton將值傳遞給它?用新內容創建新框架python

代碼:

import Tkinter as tk 
import tkMessageBox 
import json 
import requests 
from urllib import urlopen 
import os.path 
import threading 

類的myapp(tk.Frame):

def callfunc(self,title = "", author = "", body = ""): 
    tk.Frame.__init__(self, top) 
    self.canvas = tk.Canvas(top, borderwidth=0, background="#ffffff") 
    self.frame = tk.Frame(self.canvas, background="#ffffff") 
    self.vsb = tk.Scrollbar(top, orient="vertical", command=self.canvas.yview) 
    self.canvas.configure(yscrollcommand=self.vsb.set) 

    self.vsb.pack(side="right", fill="y") 
    self.canvas.pack(side="left", fill="both", expand=True) 
    self.canvas.create_window((4,4), window=self.frame, anchor="nw", 
           tags="self.frame") 

    self.frame.bind("<Configure>", self.onFrameConfigure) 
    print title 
    data_json = "" 
    L1 = tk.Label(self, text="Title") 
    L1.pack() 
    E1 = tk.Entry(self, bd =5) 
    E1.pack() 
    #E1.insert(0,title) 

    L2 = tk.Label(self, text="Author") 
    L2.pack() 
    E2 = tk.Entry(self, bd =5) 
    E2.pack() 
    #E2.insert(0,author) 

    L3 = tk.Label(self, text="Body") 
    L3.pack() 
    E3 = tk.Entry(self, bd =5) 
    E3.pack() 
    #E3.insert(0,body) 
    if (title !=""): 
     data = {"author": E2.get(), 
     "body" : E3.get(), 
     "title" : E1.get()} 
     data_json = json.dumps(data) 
    self.SubmitButton = tk.Button(self,text="Submit", fg="White", bg="#0094FF", 
           font=("Grobold", 10), command = lambda: self.submitfunc(data_json)) 
    self.SubmitButton.pack() 
    #SubmitButton.pack() 

def submitfunc(self,data_json): 
    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} 
    url = 'http://localhost/spritle/api.php?action=insert_list&data_json=' 
    check = self.connected_to_internet(url) 
    if(check): 
     r = requests.post(url+data_json ,headers=headers) 
     print r.status_code 
     # if (r.status_code == 200): 
     #  tkMessageBox.showinfo("Result","success") 
     # else: 
     #  if(os.path.isfile("offline_post.json")): 
     #   with open('offline_post.json','a') as f: 
     #    f.write(data_json+"\n") 
     #  else: 
     #   open('offline_post.json', 'a') 
     #   with open('offline_post.json','a') as f: 
     #    f.write(data_json+"\n") 

# homeButton = Button(text="Home", fg="White", bg="#0094FF", 
#        font=("Grobold", 10), command = view) 
# homeButton.pack() 

def connected_to_internet(self,url, timeout=5): 
    try: 
     _ = requests.get(url, timeout=timeout) 
     #threading.Timer(10, connected_to_internet(url)).start() 
     #print "asd" 
     return True 
    except requests.ConnectionError: 
     print("No internet connection available.") 
     return False 

def onFrameConfigure(self,event): 
    self.canvas.configure(scrollregion=self.canvas.bbox("all")) 


def __init__(self, parent):   
    self.home() 

def home(self): 
    tk.Frame.__init__(self, top) 
    self.canvas = tk.Canvas(top, borderwidth=0, background="#ffffff") 
    self.frame = tk.Frame(self.canvas, background="#ffffff") 
    self.vsb = tk.Scrollbar(top, orient="vertical", command=self.canvas.yview) 
    self.canvas.configure(yscrollcommand=self.vsb.set) 

    self.vsb.pack(side="right", fill="y") 
    self.canvas.pack(side="left", fill="both", expand=True) 
    self.canvas.create_window((4,4), window=self.frame, anchor="nw", 
           tags="self.frame") 

    self.frame.bind("<Configure>", self.onFrameConfigure) 
    self.row=0 
    # url = "http://localhost/spritle/api.php?action=get_users"; 
    # r = requests.get(url) 
    # j = r.json() 
    E1 = tk.Label(self.frame, text="Title") 
    E1.grid(row=self.row, column=0) 
    E1 = tk.Label(self.frame, text="Author") 
    E1.grid(row=self.row, column=1) 
    E1 = tk.Label(self.frame, text="Body") 
    E1.grid(row=self.row, column=2) 
    j = [[0 for x in range(5)] for x in range(5)] 
    # j[0]['title'] = "asdg" 
    # j[0]['author'] = "asdg" 
    # j[0]['body'] = "asdg" 
    print j 
    for val in j: 
     self.row += 1 
     T1 = tk.Label(self.frame, text=val) 
     T1.grid(row=self.row, column=0) 
     A1 = tk.Label(self.frame, text=val) 
     A1.grid(row=self.row, column=1) 
     B1 = tk.Label(self.frame, text=val) 
     B1.grid(row=self.row, column=2) 
     editButton = tk.Button(self.frame, text="Edit", fg="White", bg="#0094FF", 
           font=("Grobold", 10),command = lambda title=val,author=val,body=val: self.callfunc(title,author,body)) 
     editButton.grid(row=self.row,column=3) 
    #  editButton.pack() 
    newButton = tk.Button(self.frame, text="New Post", fg="White", bg="#0094FF", 
           font=("Grobold", 10),command = lambda:self.callfunc) 
    newButton.grid(row = self.row + 1, column = 2) 

top = tk.Tk() 
top.title("App") 
sizex = 400 
sizey = 300 
posx = 50 
posy = 50 
top.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) 
app = myapp(top) 
top.mainloop() 

我新的GUI編程。有沒有辦法做到這一點?或者我可以覆蓋舊框架本身? 試圖用同樣的框架,但內容不會覆蓋它顯示每一件事....

+0

我很迷惑d ..爲什麼callfunc和home都調用Frame .__ init__並且都使用'top'全局變量? –

+0

哦,我想我明白你想要一個新的窗口來打開它的內容吧?好吧,讓我看看我能否給你一個答案... –

+0

是的確切.... – user3041822

回答

1

我想你可能會產生混淆框架與Toplevels(窗口)一幀僅僅是一個普通的容器,它沒有給父母的時候會生成它自己的一個窗口,而是要創造新的窗口,你需要做一個Toplevel小窗口部件:如果新窗口需要有它的東西(當然它呢!),那麼你可以考慮做

class EXAMPLE_APP(tk.Frame): 
    def __init__(self,master=None): 
     tk.Frame.__init__(self,master) 
     self.master.title("still a master") 

     self.windows = [] 
     self.new_button = tk.Button(self,text="make a new window",command=self.new_window) 
     self.new_button.grid() 
     self.del_button = tk.Button(self,text="delete a window",command=self.del_window) 
     self.del_button.grid() 

    def new_window(self,event=None): 
     new = tk.Toplevel(self) 
     new.title("window %d"%len(self.windows)) 
     tmp_label = tk.Label(new,text="here is the label") 
     tmp_label.grid() 
     #it is only temporary because reference is lost when the function finishes, it would be much preferable to have a separate class 
     self.windows.append(new) 

    def del_window(self,event=None): 
     self.windows.pop().destroy() 

app = EXAMPLE_APP() #note that you don't have to explicitly specify a root 
app.grid() #still have to grid the Frame to its master 

app.mainloop() 

只爲彈出的類:

class Popup(tk.Toplevel): 
    def __init__(self,tk_master,title=None,author=None,body=None): 
     #most of this code is from your callfunc() method, just changed what is master to widgets 
     tk.Toplevel.__init__(self,tk_master) 
     if title: 
      self.title(title) 
     self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff") 
     self.frame = tk.Frame(self.canvas, background="#ffffff") 
     ... 

    def onFrameConfigure(self,event): 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 



class myapp(tk.Frame): 
    def callfunc(self,title = "", author = "", body = ""): 
     popup = Popup(self.parent,title,author,body) 

    ... 

    def __init__(self, parent): 
     self.parent = parent 
     self.home() 

    def home(self): 
     tk.Frame.__init__(self, self.parent) #wouldn't this make more sense in __init__? 
     ... 
+0

'def new_window(self,event = None): new = tk.Toplevel(self) new.title(「windkmow% d)%len(self.windows)) L1 = new.Label(self,text =「Title」) L1.grid() E1 = new.Entry(self,bd = 5) E1.grid() #E1.insert(0,title)' 如何在彈出窗口中添加新標籤? – user3041822

+1

@ user3041822在這種情況下,使用'new'作爲父'標籤(new,...)','Entry(new,...)' – furas

+0

self是第一個窗口,所以如果它是窗口小部件的主窗口。 grid()到主窗口,但new代表新窗口,我會更新我的答案以包含此。 –