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()
あなたの問題はあなたが一度にすべてのページを作成しているという事実に関連している場合は、あなたがデータを持っていた後まで、ページを作成するために待って試してみましたか? –
@BryanOakley申し訳ありませんが、少し新しくなっていますが、プログラムの実行時にすべてのページを初期化しなければならないと思いましたか?後でそれをどうやって作りますか? –
コピーしたこの特定のコードでは、最初にページを作成する必要があります。ページを作成する他の多くの方法があります。他の誰かからコピーしたコードを理解することは重要であり、そのコードがどのように機能するかを理解していなければ使用しないでください。残念ながら、初心者にはあまり良くないコードをいくつかコピーしています。 –