tkinter Components Example
from tkinter import *
root=Tk()
# METHOD 1: 创建变量var,并预先选中value为2的单选按钮
var=IntVar()
var.set(1)
# METHOD 2:
#var=IntVar(value=1)
ra1=Radiobutton(root,text='王者荣耀',variable=var,value=0,indicatoron=0)
ra1.grid(row=0,column=0)
ra2=Radiobutton(root,text='和平精英',variable=var,value=1,indicatoron=0)
ra2.grid(row=0,column=1)
ra3=Radiobutton(root,text='天涯明月刀',variable=var,value=2,indicatoron=0)
ra3.grid(row=0,column=2)
root.mainloop()
单选按钮,可以改变样式,变得像一个普通按钮的样子,改变样式的参数是:indicatoron 只要设置为0,就可以改变

单选选择框,可以改变样式,变得像一个普通按钮的样子,改变样式的参数是:indicatoron 只要设置为1,就可以改变

from tkinter import *
root=Tk()
def selectjob():
if var.get()==0: # 获取变量的值与单选按钮的value来对比
print('ra1被选中')
elif var.get()==1:
print('ra2被选中')
else:
print('ra3被选中')
var=IntVar() # 创建变量var,并预先选中value为2的单选按钮
var.set(1)
ra1=Radiobutton(root,text='王者荣耀',variable=var,value=0)
ra1.grid(row=0,column=0)
ra2=Radiobutton(root,text='英雄联盟',variable=var,value=1)
ra2.grid(row=0,column=1)
ra3=Radiobutton(root,text='绝地求生',variable=var,value=2)
ra3.grid(row=0,column=2)
# ra2.select() 也可以在这里用select来预先选中某个按钮
but1=Button(root,text="判断",command=selectjob)
but1.grid(row=0,column=3)
root.mainloop()
variable 绑定的变量也可以是字符串变量,相应地,value 就要取一个字符串,当然这个字符串要唯一,不要取相同的字符串,否则无法区别是哪一个单选按钮。

from tkinter import *
root=Tk()
var=IntVar() # 创建变量var,并预先选中value为2的单选按钮
var.set(1)
img1=PhotoImage(file='1.png')
img2=PhotoImage(file='2.png')
img3=PhotoImage(file='3.png')
ra1=Radiobutton(root,text='PIC1',image=img1,variable=var,value=0)
ra1.grid(row=0,column=0)
ra2=Radiobutton(root,text='PIC2',image=img2,variable=var,value=1)
ra2.grid(row=0,column=1)
ra3=Radiobutton(root,text='PIC3',image=img3,variable=var,value=2)
ra3.grid(row=0,column=2)
root.mainloop()

from tkinter import *
def selectjob():
print(var.get()) # 获取选择的选项
root=Tk()
var=IntVar() # 创建变量var,并预先选中value为2的单选按钮
var.set(1)
list1=['足球','排球','篮球','乒乓球','体操','举重','田径','游泳','射击','拳击']
for index,item in enumerate(list1):
# 用for循环和enumerate函数实现同时输出索引和列表元素内容
ra1=Radiobutton(root,text=item,variable=var,value=index+1,command=selectjob)
ra1.grid(row=0,column=index,sticky=W)
root.mainloop()

import tkinter as tk
root = tk.Tk()
counter = 0
def clickCount():
global counter
counter += 1
lab1.config(text=str(counter))
lab1 = tk.Label(root,text='null')
lab1.pack()
btn1 = tk.Button(root,text="确定",command=clickCount)
btn1.pack()
root.mainloop()

使用command时,虽然比较简单方便,但也存在很大的局限性:
from tkinter import *
root = Tk()
def move(event):
lab2["text"] = "鼠标移动到:(%s,%s)" % (event.x,event.y)
def click(event):
lab2["text"] = "鼠标在(%s,%s)处单击" % (event.x,event.y)
lab1 = Label(root,height=5,width=50)
lab1.bind("<Motion>",move)
lab1.bind("<Button-1>",click)
lab2 = Label(root)
lab1.pack()
lab2.pack()
root.mainloop()

所有的组件都有一个Bind()方法,该方法可以为任意的事件绑定事件处理方法
Widget.bind(event,handler)
event事件的字符串大致格式为:modifier-type-detail
Widght.unbind("<····>")Entry(输入框)组件通常用于获取用户的输入文本
如果你希望接收多行文本的输入,可以使用 Text 组件
import tkinter as tk
root = tk.Tk()
entry0= tk.Entry(root)
entry0.pack(padx=20, pady=20)
entry0.delete(0, "end")
entry0.insert(0, "默认文本...")
root.mainloop()

strValue = ssss .get()
绑定 Entry 组件到 Tkinter 变量(StringVar),并通过该变量设置和获取输入框的文本:
import tkinter as tk
root = tk.Tk()
v = tk.StringVar()
entry_0 = tk.Entry(root, textvariable=v)
entry_0.pack()
v.set("Hello, Python!")
strValue = v.get()
root.mainloop()

from tkinter import *
root = Tk()
root.geometry('200x200')
lf = LabelFrame(root, text='normal状态')
lf.place(relx=0.1, rely=0.25, relwidth=0.8, relheight=0.5)
entry_0 = Entry(lf, state='normal')
entry_0.place(relx=0.1, rely=0.25, relwidth=0.8)
root.mainloop()
state取值: normal disable enable readonly

from tkinter import *
from tkinter import messagebox
root=Tk()
def limit():
try:
float(entry_0.get()) #获取entry_0的值,转为浮点数,如果不能转捕获异常
entry_0.delete('0','end')
entry_0.insert('1.0',entry_0.get())
except:
messagebox.showwarning('警告','请输入数字')
entry_0 = Entry(root)
entry_0.grid(row=0,column=0)
button = Button(root,text='Set',command=limit)
button.grid(row=0,column=1)
mainloop()
除float外,还可以使用float int 等来限制

import tkinter
root = tkinter.Tk()
menu = tkinter.Menu(root)#实例化菜单栏对象
submenu = tkinter.Menu(menu, tearoff=1)#实例化菜单对象,tearoff设置为1后,表示菜单是可以独立出来的
submenu.add_command(label="打开")
submenu.add_command(label="保存")
submenu.add_command(label="关闭")
menu.add_cascade(label="文件", menu=submenu)#菜单栏对象添加菜单对象
submenu = tkinter.Menu(menu, tearoff=0)
submenu.add_command(label="复制")
submenu.add_command(label="粘贴")
submenu.add_separator()#菜单项之间的分割线
submenu.add_command(label="剪切")
menu.add_cascade(label="编辑", menu=submenu)#添加分层菜单项
submenu = tkinter.Menu(menu, tearoff=0)
submenu.add_command(label="关于")
menu.add_cascade(label="帮助", menu=submenu)
root.config(menu=menu)#需要使用主窗口的config()方法将菜单栏对象添加的窗口
root.mainloop()

import tkinter
root = tkinter.Tk()
menu = tkinter.Menu(root, tearoff=0)
menu.add_command(label="Copy")
menu.add_command(label="Paste")
menu.add_separator()
menu.add_command(label="Cut")
def popupmenu(event):
menu.post(event.x_root, event.y_root)
root.bind("<Button-3>", popupmenu)
root.mainloop()

from tkinter import *
master = Tk()
variable = StringVar(master)
variable.set("one") # <em>default value</em>
w = OptionMenu(master, variable, "one", "two", "three")
w.pack()
mainloop()

Text控件通常用作编辑框,可以接收文字的输入, 还可以用做样式化代码编辑器、web浏览器等
Text控件支持显示多行文本,文本内容中有换行符\n,就会换行显示。
width 表示TEXT的宽度,以字符为单位,具体显示宽度依赖字体大小(font size)
height 表示TEXT的高度,以字符为单位,具体显示高度依赖字体大小(font size)
import tkinter
root = tkinter.Tk()
root.title('tkinter.Text Example')
width = 300
height = 300
root.geometry(f'{width}x{height}')
text = tkinter.Text(root, width=40, height=10)
text.pack()
root.mainloop()

import tkinter
root = tkinter.Tk()
root.title('tkinter.Text Example')
width = 300
height = 300
root.geometry(f'{width}x{height}')
text = tkinter.Text(root, width=40, height=10)
text.pack()
text.insert('1.0', '这是文本框,你可以输入任何内容')
root.mainloop()
text.insert('1.0', '这是文本框,你可以输入任何内容')
index=‘1.0’,表示插入的位置在第1行第0个字符处,也就是行首。由于历史惯例,行号从1开始计数,字符编号从0开始计数。

insert(index, chars, *args) insert是在index处的字符前插入字符
index 表示插入文本的位置chars 表示文本的内容| line.char | 表示第几行的第几个字符,也就是我们前面例子使用的形式 |
|---|---|
| line.end | 表示在行尾位置(该行的换行符前)插入 |
| END | 在文本的最后插入 |
使用注意:
from tkinter.constants import END
# END实际就是字符串'end'
text.insert(END, 'Hello End')
import tkinter
root = tkinter.Tk()
root.title('tkinter.Text Example')
width = 300
height = 300
root.geometry(f'{width}x{height}')
text = tkinter.Text(root, width=40, height=10)
text.pack()
text.insert('1.0', '这是文本框,你可以输入任何内容')
text.delete('1.0', '1.6')
root.mainloop()
效果就是:字符串 这是文本框, 被删除掉了

import tkinter
root = tkinter.Tk()
root.title('tkinter.Text Example')
width = 300
height = 300
root.geometry(f'{width}x{height}')
text = tkinter.Text(root, width=40, height=10)
text.pack()
text.insert('1.0', '这是文本框,你可以输入任何内容\n')
ssss = text.get('1.0', '1.7')
text.insert(tkinter.END, ssss)
root.mainloop()

import tkinter
from tkinter.constants import (HORIZONTAL, VERTICAL, RIGHT, LEFT, X, Y, BOTH, BOTTOM, YES, NONE, END, CURRENT)
root = tkinter.Tk()
root.title('滚动条Text Example')
text = tkinter.Text(root,width=50,height=8, wrap=NONE)
scroll = tkinter.Scrollbar()
# 放到窗口的右侧, 填充Y竖直方向
scroll.pack(side=tkinter.RIGHT,fill=tkinter.Y)
# 两个控件关联
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
text.pack()
str1 = 'Hello , Python \n' \
'Hello , Python \n' \
'Hello , Python \n' \
'Hello , Python \n' \
'Hello , Python \n' \
'Hello , Python \n' \
'Hello , Python \n' \
'Hello , Python \n' \
'Hello , Python \n'
text.insert(tkinter.INSERT,str1)
root.mainloop()

yscrollcommand 使Text控件可以垂直滚动。yscrollcommand=scrollbar_v.set,将Scrollbar与 Text绑定。xscrollcommand 使Text控件可以水平滚动。xscrollcommand=scrollbar_h.set,将Scrollbar与 Text绑定。wrap wrap属性,用来控制当一行的内容太多,超出Text的width时,文本的内容怎样显示。简单讲就是控制自动换行。WORD表示单词换行;CHAR(default)表示字符换行;NONE 表示不自动换行。config()上面的例子中,Scrollbar与Text的绑定是在Text对象创建时,"静态"绑定的。能否"动态"绑定呢?答案是肯定的。就是使用config函数。通过查看源码发现,Text类中并没有config函数,其实config函数是从Misc继承过来的。import tkinter
root = tkinter.Tk()
root.title('tkinter.Text Example')
width = 300
height = 300
root.geometry(f'{width}x{height}')
text = tkinter.Text(root, width=40, height=10)
text.pack()
text.insert('1.0', '这是文本框,你可以输入任何内容\n')
text.insert(tkinter.END, text.count('1.0', tkinter.END))
root.mainloop()
换行\n两个字符

所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc
在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建
我在尝试使用Nokogiri构建XML文档时遇到了一个小问题。我想将我的元素之一称为“文本”(请参阅下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似以下的操作xml.text--但它似乎是.text是Nokogiri已经用来做其他事情的方法。因此,当我写这行时xml.textNokogiri没有创建名为的新元素但只是写了意味着成为元素内容的文本。我怎样才能让Nokogiri实际制作一个名为的元素??builder=Nokogiri::XML::Builder.newdo|xml|xml.TEI("xmlns"=>"http://www.tei-c.org/ns/1.0"
所以...SublimeText具有折叠方法的内置功能,但是一旦方法声明跨越多行,它就会失去这种能力。有谁知道插件或使它工作的方法吗?具体来说,我在使用ruby时遇到了这个问题(我的团队遵守关于行长度的严格风格指南),但语言应该无关紧要。 最佳答案 无需单击出现在函数定义第一行旁边的装订线中的向下箭头,您需要做的就是将光标放在函数的一个缩进行上(不是缩进的函数参数,而是在函数定义本身)并使用CtrlShift[键绑定(bind)(在OSX上使用⌘Alt[)折叠函数及其参数。使用CtrlShift](⌘Alt]在OSX上)展开,或
我是程序员的新手,请原谅我的新手。所以我正在使用Nokogiri来抓取警方的犯罪记录。这是下面的代码:require'rubygems'require'nokogiri'require'open-uri'url="http://www.sfsu.edu/~upd/crimelog/index.html"doc=Nokogiri::HTML(open(url))putsdoc.at_css("title").textdoc.css(".brief").eachdo|brief|putsbrief.at_css("h3").textend我使用选择器小工具书签来查找日志(.brief)的C
在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine
require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]
我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串