- Python GUI Programming Cookbook
- Burkhard A. Meier
- 503字
- 2021-07-30 10:08:21
Adding several widgets in a loop
So far we have created several widgets of the same type (for example. Radiobutton
) by basically copying and pasting the same code and then modifying the variations (for example, the column number). In this recipe, we start refactoring our code to make it less redundant.
Getting ready
We are refactoring some parts of the previous recipe's code, so you need that code to apply to this recipe to.
How to do it...
# First, we change our Radiobutton global variables into a list. colors = ["Blue", "Gold", "Red"] # 1 # create three Radiobuttons using one variable radVar = tk.IntVar() Next we are selecting a non-existing index value for radVar. radVar.set(99) # 2 Now we are creating all three Radiobutton widgets within one loop. for col in range(3): # 3 curRad = 'rad' + str(col) curRad = tk.Radiobutton(win, text=colors[col], variable=radVar, value=col, command=radCall) curRad.grid(column=col, row=5, sticky=tk.W) We have also changed the callback function to be zero-based, using the list instead of module-level global variables. # Radiobutton callback function # 4 def radCall(): radSel=radVar.get() if radSel == 0: win.configure(background=colors[0]) elif radSel == 1: win.configure(background=colors[1]) elif radSel == 2: win.configure(background=colors[2])
Running this code will create the same window as before, but our code is much cleaner and easier to maintain. This will help us when we expand our GUI in the following recipes.
How it works...
In line 1, we have turned our global variables into a list.
In line 2, we are setting a default value to the tk.IntVar
variable we named radVar
. This is important because, while in the previous recipe we had set the value for Radiobutton
widgets starting at 1, in our new loop it is much more convenient to use Python's zero-based indexing. If we did not set the default value to a value outside the range of our Radiobutton
widgets, one of the radio buttons would be selected when the GUI appears. While this in itself might not be so bad, it would not trigger the callback and we would end up with a radio button selected that does not do its job (that is, change the color of the main win form).
In line 3 we are replacing the three previously hard-coded creations of the Radiobutton widgets with a loop, which does the same. It is just more concise (fewer lines of code) and much more maintainable. For example, if we want to create 100 instead of just 3 Radiobutton
widgets, all we have to change is the number inside Python's range operator. We would not have to type or copy and paste 97 sections of duplicate code, just one number.
Line 4 shows the modified callback, which physically lives above the previous lines. We placed it below to give emphasis to the more important parts of this recipe.
There's more...
This recipe concludes the first chapter of this book. All the following recipes in all of the next chapters will build upon the GUI we have constructed so far, greatly enhancing it.
- Windows phone 7.5 application development with F#
- 電腦維護與故障排除傻瓜書(Windows 10適用)
- 分布式微服務架構:原理與實戰
- OUYA Game Development by Example
- STM32嵌入式技術應用開發全案例實踐
- 單片機原理與技能訓練
- Mastering Quantum Computing with IBM QX
- The Applied Artificial Intelligence Workshop
- 基于S5PV210處理器的嵌入式開發完全攻略
- 創客電子:Arduino和Raspberry Pi智能制作項目精選
- 計算機組裝與維護
- 數據恢復與硬盤修理
- Hands-On Unsupervised Learning with Python
- 電腦組裝與硬件維修入門與提高
- 勇敢的芯伴你玩轉Nios II(電子設計與嵌入式開發實踐叢書)