2017-05-03 6 views
0

TeamCityでビルドを作成するスクリプトがあります。私はTkinderを使ってこれを実現するGUIを作成しようとしています。私は複数のフレームを使用してshow_frame()コマンドを使用してステップを作成していますので、複数のステップがあります(つまり、資格情報の取得 - ビルド名の入力 - >テンプレートの追加 - など)。私の問題は次のとおりです。複数のREST呼び出しを行うため、最初の手順でユーザーのユーザー名とパスワードを取得します。しかし、プログラムの開始時にすべてのページが初期化されるため、RESTを呼び出すすべてのメソッドは、まだクレデンシャルを持たないためエラーが発生します。マルチフレームTkinderアプリで値を「待機」する機能を得る

ユーザがユーザ名とパスワードを入力するのを待つために、後続の手順(およびその方法)を取得するにはどうすればよいですか?

(PageOneクラスの)次のコードから、メニュー項目をメニューに動的に追加できるように、REST呼び出しを通じてBitBcuketからプロジェクトのリストを取得しようとしていますが、ユーザー名とパスワードの取得を待ちます。

import json 
import requests 
import Tkinter as tk 
import tkMessageBox 

TITLE_FONT = ("Arial", 18, "bold") 


class CreateBuild(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     self.username = None 
     self.password = None 
     self.bit_projects = None 
     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 
     for F in (StartPage, PageOne, PageTwo): 
      page_name = F.__name__ 
      frame = F(parent=container, controller=self) 
      self.frames[page_name] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("StartPage") 

    def show_frame(self, page_name): 
     frame = self.frames[page_name] 
     frame.tkraise() 

    def authenticate(self, username, password): 
     r = requests.head('https://source.amirsys-int.com/projects', auth=(username, password)) 
     if r.status_code == 405: 
      self.username = username 
      self.password = password 
      self.show_frame("PageOne") 
     else: 
      tkMessageBox.showinfo("Error", "Incorrect username and/or password.\nPlease enter your Crowd username and " 
              "password.") 

    def get_bitbucket_projects(self): 
     r = requests.get('https://source.amirsys-int.com/rest/api/1.0/projects', auth=(self.username, 
                         self.password)) 
     j = json.loads(r.text) 
     size = j['size'] 
     repo_dic = {} 
     for i in range(0, size): 
      name = j['values'][i]['name'] 
      repo_id = j['values'][i]['key'] 
      repo_dic[name] = repo_id 

     self.bit_project = repo_dic 


class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     self.grid_rowconfigure(0, weight=1) 
     self.grid_columnconfigure(0, weight=1) 
     instructions = tk.Label(self, text="Please enter your Crowd credentials", font=TITLE_FONT) 
     instructions.grid(column=1, row=1, columnspan=3, padx=30, pady=30) 
     username = tk.Label(self, text="Crowd Username: ") 
     username.grid(column=1, row=2, columnspan=2) 
     password = tk.Label(self, text="Crowd Password: ") 
     password.grid(column=1, row=3, columnspan=2) 
     username_entry = tk.Entry(self) 
     username_entry.grid(column=3, row=2) 
     password_entry = tk.Entry(self, show="*") 
     password_entry.grid(column=3, row=3) 
     button = tk.Button(self, text="Next", command=lambda: controller.authenticate(username_entry.get(), 
                         password_entry.get())) 
     button.grid(column=4, row=4, padx=10, pady=10) 
     self.grid_rowconfigure(5, weight=1) 
     self.grid_columnconfigure(5, weight=1) 


class PageOne(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     self.grid_rowconfigure(0, weight=1) 
     self.grid_columnconfigure(0, weight=1) 
     instructions = tk.Label(self, text="Enter build information", font=TITLE_FONT) 
     instructions.grid(column=1, row=1, columnspan=3, padx=30, pady=30) 
     build_name = tk.Label(self, text="Build Name: ") 
     build_name.grid(column=1, row=2, columnspan=2) 
     build_name_entry = tk.Entry(self) 
     build_name_entry.grid(column=3, row=2) 

     project_key = tk.Label(self, text="BitBucket Project: ", anchor="w") 
     project_key.grid(column=1, row=3, columnspan=2) 
     project_menu = tk.Menubutton(self, text="Project", anchor="w") 
     project_menu.grid(column=3, row=3, columnspan=2) 
     project_menu.menu = tk.Menu(project_menu) 

     for key, value in controller.bit_projects: 
      project_menu.menu.add_checkbutton(label=key, variable=value) 

     self.grid_rowconfigure(4, weight=1) 
     self.grid_columnconfigure(4, weight=1) 


class PageTwo(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 


if __name__ == "__main__": 
    app = CreateBuild() 
    app.geometry("800x600") 
    app.title("Create TeamCity Build") 
    app.mainloop() 
+0

あなたの問題はあなたが一度にすべてのページを作成しているという事実に関連している場合は、あなたがデータを持っていた後まで、ページを作成するために待って試してみましたか? –

+0

@BryanOakley申し訳ありませんが、少し新しくなっていますが、プログラムの実行時にすべてのページを初期化しなければならないと思いましたか?後でそれをどうやって作りますか? –

+0

コピーしたこの特定のコードでは、最初にページを作成する必要があります。ページを作成する他の多くの方法があります。他の誰かからコピーしたコードを理解することは重要であり、そのコードがどのように機能するかを理解していなければ使用しないでください。残念ながら、初心者にはあまり良くないコードをいくつかコピーしています。 –

答えて

1

あなたは(プログラムの起動時に実行される)__init__メソッドのうち、およびフレームが表示されたときに呼び出されるメソッドにそのコードを移動する必要があります。)(tkraise。

class PageOne(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     self.grid_rowconfigure(0, weight=1) 
     self.grid_columnconfigure(0, weight=1) 
     instructions = tk.Label(self, text="Enter build information", font=TITLE_FONT) 
     instructions.grid(column=1, row=1, columnspan=3, padx=30, pady=30) 
     build_name = tk.Label(self, text="Build Name: ") 
     build_name.grid(column=1, row=2, columnspan=2) 
     build_name_entry = tk.Entry(self) 
     build_name_entry.grid(column=3, row=2) 

     project_key = tk.Label(self, text="BitBucket Project: ", anchor="w") 
     project_key.grid(column=1, row=3, columnspan=2) 
     self.project_menu = tk.Menubutton(self, text="Project", anchor="w") 
     self.project_menu.grid(column=3, row=3, columnspan=2) 
     self.project_menu.menu = tk.Menu(self.project_menu) 

     self.grid_rowconfigure(4, weight=1) 
     self.grid_columnconfigure(4, weight=1) 

    def tkraise(self): 
     for key, value in self.controller.bit_projects: 
      self.project_menu.menu.add_checkbutton(label=key, variable=value) 
     tk.Frame.tkraise(self) # call the superclass to actually raise the frame 
関連する問題