用GUI界面生成一个窗体

image.png

  1. import tkinter as tk
  2. win = tk.Tk()
  3. win.geometry("600x400+800+400")
  4. win.title("tkWindow代码生成器")
  5. # 申明字符变量
  6. title_var = tk.StringVar()
  7. w_var = tk.StringVar()
  8. h_var = tk.StringVar()
  9. # 标题
  10. labTitle = tk.Label(win)
  11. labTitle["text"] = "标题"
  12. labTitle.place(x=10,y=10)
  13. txtTitle = tk.Entry(win,textvariable = title_var)
  14. txtTitle.place(x=60,y=10)
  15. # 宽度x高度
  16. labWH = tk.Label(win)
  17. labWH["text"] = "宽x高"
  18. labWH.place(x=10,y=40)
  19. txtW = tk.Entry(win,textvariable = w_var)
  20. txtW["width"] = 5
  21. txtW.place(x=60,y=40)
  22. txtH = tk.Entry(win,textvariable = h_var)
  23. txtH["width"] = 5
  24. txtH.place(x=130,y=40)
  25. def run_Window():
  26. global new_win
  27. global title_var
  28. global h_var
  29. global w_var
  30. new_win = tk.Tk()
  31. new_win.geometry(w_var.get() + "x" + h_var.get())
  32. new_win.title(title_var.get())
  33. new_win.mainloop()
  34. # 运行按钮
  35. btnRun = tk.Button(win)
  36. btnRun["text"] = "运行"
  37. btnRun["width"] = 20
  38. btnRun["height"] = 3
  39. btnRun["command"] = run_Window
  40. btnRun.place(x=10,y=70)
  41. def close_Window():
  42. new_win.destroy()
  43. # 停止按钮
  44. btnRun = tk.Button(win)
  45. btnRun["text"] = "停止"
  46. btnRun["width"] = 20
  47. btnRun["height"] = 3
  48. btnRun["command"] = close_Window
  49. btnRun.place(x=10,y=140)
  50. win.mainloop()

上面的实现是直接基于事件处理代码中重新创建一个窗体,然后用mainloop()执行,用destroy()进行关闭。

改进

实现代码的显示,以及只允许一个窗体实例运行。
image.png

  1. import tkinter as tk
  2. win = tk.Tk()
  3. win.geometry("600x400+800+400")
  4. win.title("tkWindow代码生成器")
  5. # 申明字符变量
  6. title_var = tk.StringVar()
  7. w_var = tk.StringVar()
  8. h_var = tk.StringVar()
  9. code_var = tk.StringVar()
  10. # 标题
  11. labTitle = tk.Label(win)
  12. labTitle["text"] = "标题"
  13. labTitle.place(x=10,y=10)
  14. txtTitle = tk.Entry(win,textvariable = title_var)
  15. txtTitle.place(x=60,y=10)
  16. # 宽度x高度
  17. labWH = tk.Label(win)
  18. labWH["text"] = "宽x高"
  19. labWH.place(x=10,y=40)
  20. txtW = tk.Entry(win,textvariable = w_var)
  21. txtW["width"] = 5
  22. txtW.place(x=60,y=40)
  23. txtH = tk.Entry(win,textvariable = h_var)
  24. txtH["width"] = 5
  25. txtH.place(x=130,y=40)
  26. has_Run = False #是否已经有一个窗体实例运行
  27. def run_Window():
  28. global new_win
  29. global title_var
  30. global h_var
  31. global w_var
  32. global code_var
  33. global has_Run
  34. if has_Run == False:
  35. new_win = tk.Tk()
  36. new_win.geometry(w_var.get() + "x" + h_var.get())
  37. new_win.title(title_var.get())
  38. # 生成代码并显示
  39. code_str = "import tkinter as tk\n\n"
  40. code_str += "win = tk.Tk()\n"
  41. code_str += "win.geometry('" + w_var.get() + "x" + h_var.get()+ "')\n"
  42. code_str += "win.title('" + title_var.get() + "')\n\n"
  43. code_str += "win.mainloop()\n"
  44. codeText.delete(1.0,"end")
  45. codeText.insert("insert",code_str)
  46. has_Run = True
  47. new_win.mainloop()
  48. else:
  49. has_Run = False
  50. new_win.destroy()
  51. run_Window() # 自己调用自己是否可行?没有Goto啊
  52. # 运行按钮
  53. btnRun = tk.Button(win)
  54. btnRun["text"] = "运行"
  55. btnRun["width"] = 10
  56. btnRun["height"] = 1
  57. btnRun["command"] = run_Window
  58. btnRun.place(x=220,y=10)
  59. def close_Window():
  60. new_win.destroy()
  61. # 停止按钮
  62. btnRun = tk.Button(win)
  63. btnRun["text"] = "停止"
  64. btnRun["width"] = 10
  65. btnRun["height"] = 1
  66. btnRun["command"] = close_Window
  67. btnRun.place(x=300,y=10)
  68. # 代码区
  69. codeText =tk.Text(win)
  70. codeText["width"]=80
  71. codeText["height"]=21
  72. codeText.place(x=10,y=80)
  73. win.mainloop()

改进:各个参数默认值+top\left值的支持

image.png

  1. import tkinter as tk
  2. win = tk.Tk()
  3. win.geometry("600x400+800+400")
  4. win.title("tkWindow代码生成器")
  5. # 申明字符变量
  6. title_var = tk.StringVar()
  7. w_var = tk.StringVar()
  8. h_var = tk.StringVar()
  9. top_var = tk.StringVar()
  10. left_var = tk.StringVar()
  11. code_var = tk.StringVar()
  12. # 标题
  13. labTitle = tk.Label(win)
  14. labTitle["text"] = "标题"
  15. labTitle.place(x=10,y=10)
  16. txtTitle = tk.Entry(win,textvariable = title_var)
  17. txtTitle.insert(0,"我的窗体") # 默认窗体名称
  18. txtTitle.place(x=60,y=10)
  19. # 宽度x高度
  20. labWH = tk.Label(win)
  21. labWH["text"] = "宽x高"
  22. labWH.place(x=10,y=40)
  23. txtW = tk.Entry(win,textvariable = w_var)
  24. txtW["width"] = 5
  25. txtW.insert(0,"400") #默认窗体宽度
  26. txtW.place(x=60,y=40)
  27. txtH = tk.Entry(win,textvariable = h_var)
  28. txtH["width"] = 5
  29. txtH.insert(0,"300") #默认窗体高度
  30. txtH.place(x=130,y=40)
  31. # +top+left
  32. labTL = tk.Label(win)
  33. labTL["text"] = "顶+左"
  34. labTL.place(x=170,y=40)
  35. txtLeft = tk.Entry(win,textvariable = left_var)
  36. txtLeft["width"] = 5
  37. txtLeft.insert(0,"600") #默认窗体Left值
  38. txtLeft.place(x=260,y=40)
  39. txtTop = tk.Entry(win,textvariable = top_var)
  40. txtTop["width"] = 5
  41. txtTop.insert(0,"400") #默认窗体Top值
  42. txtTop.place(x=330,y=40)
  43. has_Run = False #是否已经有一个窗体实例运行
  44. # 运行窗体实例
  45. def run_Window():
  46. global new_win
  47. global title_var
  48. global h_var
  49. global w_var
  50. global top_var
  51. global left_var
  52. global code_var
  53. global has_Run
  54. if has_Run == False:
  55. new_win = tk.Tk()
  56. new_win.geometry(w_var.get() + "x" + h_var.get() + "+" + left_var.get() + "+" + top_var.get())
  57. new_win.title(title_var.get())
  58. # 生成代码并显示
  59. code_str = "import tkinter as tk\n\n"
  60. code_str += "win = tk.Tk()\n"
  61. code_str += "win.geometry('" + w_var.get() + "x" + h_var.get() + "+" + left_var.get() + "+" + top_var.get() + "')\n"
  62. code_str += "win.title('" + title_var.get() + "')\n\n"
  63. code_str += "win.mainloop()\n"
  64. codeText.delete(1.0,"end")
  65. codeText.insert("insert",code_str)
  66. has_Run = True
  67. new_win.mainloop()
  68. else:
  69. has_Run = False
  70. new_win.destroy()
  71. run_Window() # 自己调用自己是否可行?没有Goto啊
  72. # 运行按钮
  73. btnRun = tk.Button(win)
  74. btnRun["text"] = "运行"
  75. btnRun["width"] = 10
  76. btnRun["height"] = 1
  77. btnRun["command"] = run_Window
  78. btnRun.place(x=220,y=10)
  79. def close_Window():
  80. new_win.destroy()
  81. # 停止按钮
  82. btnRun = tk.Button(win)
  83. btnRun["text"] = "停止"
  84. btnRun["width"] = 10
  85. btnRun["height"] = 1
  86. btnRun["command"] = close_Window
  87. btnRun.place(x=300,y=10)
  88. # 代码区
  89. codeText =tk.Text(win)
  90. codeText["width"]=80
  91. codeText["height"]=21
  92. codeText.place(x=10,y=80)
  93. win.mainloop()