基于GTK+的单类模式自定义通用提示框的设计
- 格式:pdf
- 大小:163.54 KB
- 文档页数:3
Android编程⾃定义AlertDialog样式的⽅法详解本⽂实例讲述了Android编程⾃定义AlertDialog样式的⽅法。
分享给⼤家供⼤家参考,具体如下:开发的时候,通常我们要⾃定义AlertDialog来满⾜我们的功能需求:⽐如弹出对话框中可以输⼊信息,或者要展⽰且有选择功能的列表,或者要实现特定的UI风格等。
那么我们可以通过以下⽅式来实现。
⽅法⼀:完全⾃定义AlertDialog的layout.如我们要实现有输⼊框的AlertDialog布局custom_dialog.xml:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/dialog_bg"android:orientation="vertical"><TextViewandroid:id="@+id/title"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#00ffff"android:gravity="center"android:padding="10dp"android:text="Dialog标题"android:textSize="18sp" /><EditTextandroid:id="@+id/dialog_edit"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输⼊内容"android:minLines="2"android:textScaleX="16sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_cancel"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="#00ffff"android:text="取消" /><Viewandroid:layout_width="1dp"android:layout_height="40dp"android:background="#D1D1D1"></View><Buttonandroid:id="@+id/btn_comfirm"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:background="#00ffff"android:text="确定" /></LinearLayout></LinearLayout>原来在代码中使⽤:AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);View view = View.inflate(getActivity(), yout.custom_dialog, null);builder.setView(view);builder.setCancelable(true);TextView title= (TextView) view.findViewById(R.id.title);//设置标题EditText input_edt= (EditText) view.findViewById(R.id.dialog_edit);//输⼊内容Button btn_cancel=(Button)view.findViewById(R.id.btn_cancel);//取消按钮Button btn_comfirm=(Button)view.findViewById(R.id.btn_comfirm);//确定按钮//取消或确定按钮监听事件处理AlertDialog dialog = builder.create();dialog.show();这样,我们就可以弹出⼀个我们⾃定义的Dialog。
kotlin alertdialog edittextKotlin中的AlertDialog和EditText用法详解在Kotlin编程语言中,AlertDialog和EditText是两个非常常用的UI组件,可以用于在Android应用中实现对话框和文本输入功能。
本文将一步一步地介绍如何使用Kotlin编写AlertDialog,并在其中添加EditText控件,以及处理用户输入的方法。
第一步:导入依赖库和设置布局在使用AlertDialog和EditText之前,首先需要在项目的构建文件中添加相关的依赖库。
在app级别的build.gradle文件中的dependencies块中添加以下代码:implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.core:core-ktx:1.5.0'添加完依赖后,接下来需要在布局文件中添加一个按钮,点击按钮后触发显示AlertDialog对话框。
在布局文件中添加一个Button控件,代码如下所示:<Buttonandroid:id="+id/showAlertDialogButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Show AlertDialog" />第二步:获取AlertDialog实例在Kotlin中,我们可以使用AlertDialog.Builder类来创建AlertDialog 实例。
在MainActivity.kt文件中,首先需要为按钮设置点击事件监听器,并在监听器的回调方法中创建AlertDialog实例。
libgtkGtk窗⼝,控件,设置(添加图⽚等){ //本⽂参与,欢迎正在阅读的你也加⼊,⼀起分享。
}{1、关于窗⼝1 // 创建顶层窗体,后⾯有POPUP的2 GtkWidget *main_window;3 main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);45 // 设置title⽂字,注意UTF8格式的⽂字转换,否则是乱码6 gtk_window_set_title (GTK_WINDOW (main_window), g_locale_to_utf8("哈哈",-1,NULL,NULL,NULL));78 // 设置窗体图标,⽤这条语句使所有窗体使⽤同⼀个图标,也有独⽴设置(GTK⼿册)9 gtk_window_set_default_icon_from_file( ICON_WNDICON, NULL);1011 // 设置边框宽度,基本随意12 gtk_container_set_border_width (GTK_CONTAINER (main_window), 8);1314 // 设置模式窗⼝15 gtk_window_set_modal(GTK_WINDOW (window), TRUE);1617 // 让窗⼝总在最前18 gtk_window_set_keep_above(GTK_WINDOW (window), TRUE);1920 // 移动窗⼝位置21 gtk_window_move(GTK_WINDOW (window), left, top);22 // 也是设置位置的,简单点23 gtk_window_set_position(GTK_WINDOW (main_window), GTK_WIN_POS_CENTER);2425 // 这个让叉叉⽆效26 gtk_window_set_deletable(GTK_WINDOW (main_window), FALSE);设置全屏显⽰的⼏种办法:1 //a)简单⼀点就⽤这个。
GTK_图形化应用程序开发学习笔记(十七)―框架构件、比例框.GTK+图形化应用程序开发学习笔记(十七)—框架构件、比例框架构件GTK+图形化应用程序开发学习笔记(十七)—框架构件、比例框架构件GTK+图形化应用程序开发学习笔记(十七)—框架构件、比例框架构件一、框架构件框架构件(GtkFrame)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签。
标签的位置和风格可以灵活改变。
我们用gtk_frame_set_label函数创建框架构件。
1.名称:: gtk_frame_new 功能:创建框架构件头文件: #include 函数原形: GtkWidget *gtk_frame_new( const gchar *label ; 参数:label 框架构件的标签返回值:新的框架构件label为框架构件的标签。
缺省设置时,标签放在框架的左上角。
传递NULL时,框架不显示标签。
下面是创建框架的程序例子:#include int main(int argc,char *argv[ ] { GtkWidget *window; GtkWidget *frame; GtkWidget *button; GtkWidget *box; GSList *group=NULL;/*定义组*/ gtk_init(&argc,&argvwindow=gtk_window_new(GTK_WINDOW_TOPLEVEL;gtk_widget_set_size_request(window,100,80;gtk_signal_connect(GTK_BOX(window,”destroy”,G_CALLBA CK(gtk_main_quit,NUL L; grame=gtk_frame_new(“性别”; /*创建框架构件*/gtk_container_add(GTK_CONTAINER(window,frame;/*将框架构件加入窗体*/gtk_widget_show(frame; box=gtk_vbox_new(FALSE,0;/*创建组装框*/gtk_container_add(GTK_CONTAINER(frame,box;/*将组装框加入框架构件*/gtk_widget_show(box;button=gtk_radio_button_new_with_label(group,”男”;/*创建按钮*/ group=gtk_radio_button_group(GTK_RADIO_BUTTON(button;/*将按钮加入组装框*/ gtk_box_pack_start(GTK_BOX(box,button,FALSE,FALSE,5;gtk_widget_show(button;bu tton=gtk_radio_button_new_with_label(group,”女”;group=gtk_radio_button_group(GTK_RADIO_BUTTON(butto n;gtk_box_pack_start(GTK_BOX(box,button,FALSE,FALSE,5;gtk_widget_show(button; gtk_widget_show(window; gtk_main(; } 程序运行后得到如下界面:标签文本可以用gtk_frame_set_label函数改变。
GTK:工具提示对象
工具提示对象(GtkTooltips)就是当鼠标指针移到按纽或其他构件上并停留几秒时,弹出的文本串。
工具提示对象很容易使用,同样工具提示构件也不能触发信号。
可以使用gtk_tooltips_new函数创建工具提示对象。
1.
创建工具提示对象后,要把它与某个构件联系起来,使它发挥提示的作用。
gtk_tooltips_set_tip函数可以达到这个目的。
2.
tooltip是已经创建的工具提示对象,widget是希望弹出工具提示的构件,tip_text是要弹出的文本正文。
tip_private是作为标识符的文本串,当用GtkTipsQuery实现上下文敏感的帮助时要引用该标识符。
目前,你可以把它设置为NULL。
下面是程序例子:。
C语言课程设计GTK一、教学目标本课程旨在通过C语言和GTK库的学习,让学生掌握GTK编程的基本概念和技能,能够利用C语言和GTK库创建基本的图形用户界面应用程序。
1.理解C语言的基本语法和数据结构。
2.理解GTK库的基本概念和组件。
3.掌握使用C语言和GTK库创建图形用户界面应用程序的基本步骤。
4.能够编写C语言程序,实现基本的数据处理和控制流。
5.能够使用GTK库创建基本的图形用户界面组件,如按钮、标签、文本框等。
6.能够编写C语言程序,利用GTK库实现图形用户界面应用程序的基本功能。
情感态度价值观目标:1.培养学生的编程思维和解决问题的能力。
2.培养学生对图形用户界面设计和用户体验的关注。
3.培养学生对开源软件和GTK库的认同和尊重。
二、教学内容本课程的教学内容将按照以下大纲进行和安排:1.C语言基础:–C语言简介和环境搭建–基本语法和数据类型–控制流和函数–数组和字符串2.GTK库基础:–GTK库简介和环境搭建–基本组件和事件处理–布局管理和容器–信号和槽机制3.图形用户界面设计:–创建基本组件如按钮、标签、文本框等–布局和容器的设计和应用–信号和槽机制的利用和理解–用户交互和事件处理4.项目实践:–设计并实现一个简单的图形用户界面应用程序–利用GTK库进行界面布局和组件设计–实现用户交互和事件处理功能三、教学方法为了激发学生的学习兴趣和主动性,将采用多种教学方法进行教学:1.讲授法:通过讲解和演示,让学生掌握C语言和GTK库的基本概念和技能。
2.案例分析法:通过分析具体的案例,让学生理解图形用户界面设计和事件处理的方法。
3.实验法:通过上机实验,让学生亲手编写代码,实践和巩固所学的知识和技能。
4.讨论法:通过小组讨论和交流,让学生分享学习心得和解决问题的方法。
四、教学资源为了支持教学内容和教学方法的实施,将选择和准备以下教学资源:1.教材:C语言和GTK库的相关教材,用于提供理论知识和实践指导。
⾃定义提⽰框(alert、confirm可⾃定义标题内容图标取消按钮)声明:本例⼦是基于做的修改效果:【主函数】1、msgbox(title,text,func,cancel,focus,icon)参数说明:title :弹出对话框的标题,标题内容最好在25个字符内,否则会导致显⽰图⽚的异常text :弹出对话框的内容,可以使⽤HTML代码,例如<font color='red'>删除么?</font>,如果直接带⼊函数,注意转义func :弹出对话框点击确认后执⾏的函数,需要写全函数的引⽤,例如add(),如果直接带⼊函数,注意转义。
cancel :弹出对话框是否显⽰取消按钮,为空的话不显⽰,为1时显⽰focus :弹出对话框焦点的位置,0焦点在确认按钮上,1在取消按钮上,为空时默认在确认按钮上icon :弹出对话框的图标<p><input onclick="msgbox('提⽰','请⾄少选择⼀项需要删除的记录!','',null,0,'Warning')" type="button" value="提⽰"/><input onclick="msgbox('提⽰','操作执⾏成功!','',null,0,'true')" type="button" value="操作成功"/><input onclick="msgbox('提⽰','操作执⾏失败!','',null,0,'error')" type="button" value="操作失败"/><input onclick="msgbox('确认删除么?','点击确认执⾏删除操作,点击取消不再执⾏操作!','msgbox(\'操作提⽰\',\'删除成功!\',\'\',null,0,\'true\')',1,1,'Warning')" type="button" value="confirm"/></p><script type="text/javascript" language="javascript">// <![CDATA[function msgbox(title,content,func,cancel,focus,icon){/*参数列表说明:title :弹出对话框的标题,标题内容最好在25个字符内,否则会导致显⽰图⽚的异常text :弹出对话框的内容,可以使⽤HTML代码,例如<font color='red'>删除么?</font>,如果直接带⼊函数,注意转义func :弹出对话框点击确认后执⾏的函数,需要写全函数的引⽤,例如add(),如果直接带⼊函数,注意转义。
gtk控件使用三文本框列表框gtk控件使用三文本框这里总结一下文本框和这两个常用的框件. 1 文本框gtk1.2跟gtk2.0的文本框有很大不同gtk1.2只需要一个GtkText控件就行了而gtk2.0则把文本框的许多功能分到GtkTextViewGtkTextBufferGtkTextTag等控件中。
说到底还是gtk2.0功能强大所以以下讨论只限于gtk2.0 GtkTextView它代表了窗口中可见的文本框如果只是简单使用基本用不到除创建以外的函数。
通常它需要放在一个Scrolledwindow中。
GtkTextBuffer它代表了文本框中的内容。
它与GtkTextView不同GtkTextView是一个继承自GtkWidget类的派生类的类型而GtkTextBuffer是一个继承自GObject的类型声明变量的时候要注意。
生成这样一个对象通常使用以gtk_text_view_get_buffer来关联到一个text_view中。
对于文本框的文字的插入删除都是对这么一个类型的变量来操作的。
说到插入删除又不得不提GtkTextIter它是有来保存文字在buffer中位置的结构。
插入删除都离不开指定一个位置。
比如要在当前文本框中添加一些文字通常都得得到当前buffer中的最后一个位置的Iter 然后再插入。
代码如下void text_appendGtkTextBuffer textchar buffer GtkTextIter startend gtk_text_buffer_get_boundsGTK_TEXT_BUFFERtextstartendgtk_text_buffer_insertGTK_TEXT_BUFFERtextendbuffer-1 如果要删除文本框中的全部文字只需要把最后一行改为删除函数即可不过使用gtk_text_buffer_set_textGTK_TEXT_BUFFERtext-1更省事。
一、建立菜单菜单由菜单条(GtkMenuBar)和从菜单条或其他菜单下拉的菜单(GtkMenu)组成。
在建立菜单条以前必须先建立应用程序的纵向组合框。
建立菜单分为下面几个步骤:(1)建立菜单条(GtkMenuBar),并把它加到纵向组合框内。
函数gtk_menu_bar_new建立GtkMenuBar构件。
1.下面是建立菜单和将它放入纵向组合框的代码:menuber=gtk_menu_bar_new();gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,TRUE,0);gtk_widget_show(menubar);(2)建立后的菜单条是空的,还需要增加菜单项。
用gtk_menu_item_new_with_label建立带标号的菜单项。
如:建立标号为“File”的菜单项用下面的语句:meanFile=gtk_menu_item_new_item_new_with_label(“File”);2.(3)在建立菜单项后,需要将它加到前面建立的菜单条中。
gtk_menu_bar_append函数能够实现上面的功能。
我们把上面的菜单项加到菜单条里面的代码如下:gtk_menu_bar_append(GTK_MENU_BAR(menubar),MenuFile);注意gtk_menu_bar_append和下面的gtk_menu_bar_append实际上都是宏,gtk_menu_bar_append的定义是这样如下:下面我们给出gtk_nenu_shell_append函数的原型:3、于是上面的代码也可以改成:gtk_menu_shell_append(GTK_MENU_SHELL(menubar),MenuFile);到这里我们就可以编写如下图的菜单了到这里我们已经建立了一个简单的菜单条,但大多数菜单每个菜单向都包括一个子菜单。
这席菜单只有在下拉菜单时才能看到。
GTK+2.0-----对话框GTK+2.0 2008-12-13 16:08:14 阅读595 评论0 字号:大中小订阅在G t k +中,要使用对话框是很麻烦的。
每当你要通知用户一些事情,都得创建一个窗口、几个按钮、一个标签,并将按钮、标签等组装到窗口上,然后设置回调函数。
同时,还要捕获d e l e t e _ e v e n t事件,等等。
G n o m e提供了一个容易使用的、通用的对话框构件和几个子构件,用它们可以创建通用对话框。
G n o m e还有几个使用模态对话框的函数。
GnomeDialog构件因为存在于普通G t k +中的对话框是一种权宜之计,有多少个程序员,就有多少种创建对话框的方法。
程序员必须决定对话框放在屏幕的什么地方,构件之间的填充空白大小是多少,是否在按钮之间放置分隔线,按钮放在什么容器中,以及应该设置什么快捷键,等等。
G n o m e D i a l o g构件的前提就是程序员不应该关心这些事,用户可以用它们想要的方法设置它们。
以程序员的观点来说,对话框“能使用就可以了”。
创建对话框创建G n o m e D i a l o g很简单。
下面是基本步骤摘要,后面有详细介绍:? 如果有适合需要的对话框子类,则使用相应的子类,并且可以跳过下面几步。
? 用g n o m e _ d i a l o g _ n e w ( )函数创建对话框构件。
将对话框的标题、每个按钮的名字作为参数传递到函数中去。
? 用需要的内容组装G N O M E _ D I A L O G ( d i a l o g ) - > v b o x。
? 规划一下对话框要做什么用。
可以为c l o s e或c l i c k e d信号连接适当的回调函数。
关闭对话框时,可以隐藏或销毁对话框,也可以在点击对话框时自动关闭它,或由你自己处理。
有多种交互用户与对话框的方法,所以很重要的一点是要确信所选择的设置组合,在不论用户做什么时都能起作用。
GTK+程序设计中文版GTK+程序设计中文版1.简介\t1.1 GTK+概述\t1.2 GTK+的优势和特点\t1.3 GTK+的历史发展2.GTK+的基本概念和架构\t2.1 GTK+的组件和控件\t\t2.1.1 窗口和对话框\t\t2.1.2 布局容器\t\t2.1.3 按钮和标签\t\t2.1.4 输入框和文本区域\t\t2.1.5 列表框和树视图\t2.2 GTK+事件模型\t\t2.2.1 事件循环\t\t2.2.2 事件处理函数\t2.3 GTK+信号与回调函数\t\t2.3.1 信号的概念\t\t2.3.2 连接信号与回调函数\t\t2.3.3 常用的信号和回调函数\t2.4 GTK+主题和样式\t\t2.4.1 主题的选择和加载\t\t2.4.2 样式的修改和自定义3.GTK+布局和界面设计\t3.1 布局管理器\t\t3.1.1 垂直布局\t\t3.1.2 水平布局\t\t3.1.3 表格布局\t\t3.1.4 绝对布局\t\t3.1.5 自定义布局管理器\t3.2 界面设计原则\t\t3.2.1 易用性原则\t\t3.2.2 一致性原则\t\t3.2.3 美观性原则4.GTK+的常用功能和高级特性\t4.1 图形绘制和绘图区域\t\t4.1.1 画布和绘图区域的创建\t\t4.1.2 图形绘制的基本操作\t\t4.1.3 高级绘图效果\t4.2 用户输入和事件处理\t\t4.2.1 按键和鼠标事件\t\t4.2.2 界面交互和反馈\t\t4.2.3 自定义事件处理\t4.3 数据模型和视图\t\t4.3.1 MVC模式简介\t\t4.3.2 GTK+中的数据模型\t\t4.3.3 视图和数据的绑定\t4.4 国际化和本地化支持\t\t4.4.1 字符编码和转换\t\t4.4.2 本地化资源和语言支持\t\t4.4.3 日期和时间处理5.GTK+的调试和性能优化\t5.1 调试工具的使用\t\t5.1.1 GDB调试器\t\t5.1.2 GTK+调试工具\t\t5.1.3 内存泄漏和性能问题的调试\t5.2 性能优化的策略\t\t5.2.1 代码优化技巧\t\t5.2.2 界面渲染和响应优化\t\t5.2.3 响应时间分析和优化6.GTK+的常见问题和解决方案\t6.1 常见错误和异常情况\t\t6.1.1 界面显示异常\t\t6.1.2 崩溃和异常退出\t\t6.1.3 内存泄漏问题\t6.2 常见问题的解决方案\t\t6.2.1 常见错误的调试与修复\t\t6.2.2 内存管理的优化和改进\t\t6.2.3 性能问题的解决方案7.附件\t附件一:________GTK+程序设计示例源码\t附件二:________常用资源和参考文献本文档涉及附件:________附件一:________GTK+程序设计示例源码附件二:________常用资源和参考文献本文所涉及的法律名词及注释:________法律名词1:________根据《著作权法》,指对作品享有著作权的个人或单位。
Gtk之文本框文本框也叫多行文本输入框,是gtk+较常用的构件,也是较复杂的一个构件。
它被分为以下几部分:GtkTextView:代表了窗口中可见的文本框,用来显示GtkTextBuffer.GtkTextBuffer:文本框正文的缓冲区,文本框文字的插入、删除都是对这一类变量进行操作。
GtkTextIter:保存文字在buffer中位置的结构。
GtkTextMark:A position in the buffer preserved across buffer modificationsGtkTextTag:用来给指定的文字添加一些标记,改变指定区域的文字的显示效果。
如:字体的颜色、大小的改变。
GtkTextTagTable:是GtkTextTag标记的集合表。
一、创建文本框构件GtkTextView,它代表了窗口中可见的文本框,如果只是简单使用基本用不到除了创建以外的函数。
有两种方法可以创建文本框。
一种是用默认的缓冲区创建文本框,用函数gtk_text_view_new。
另一种是指定缓冲区来创建文本框,用函数gtk_text_view_new_with_buffer。
1.名称::gtk_text_view_new功能:创建文本框构件头文件:#include函数原形:GtkWidget *gtk_text_view_new(void);参数:无返回值:新的文本框构件gtk_text_view_new创建一个新的缓冲区,如果你没有在创建之前调用函数gtk_text_view_set_buffer来设置这个缓冲区,那么系统将创建一个空的默认的缓冲区,我们可以用gtk_text_view_get_buffer 来得到这个缓冲区。
如果你用你自己的缓冲区来创建文本框可以用gtk_text_view_new_with_buffer.2.名称::gtk_text_view_new_with_buffer功能:创建树构件头文件:#include函数原形:GtkWidget *gtk_text_view_new_with_buffer(GtkTextBuffer*buffer);参数:buffer 缓冲区返回值:新的文本框构件gtk_text_view_new_with_buffer用指定的缓冲区创建一个新的文本框,我们用buffer来指定这个缓冲区,一个缓冲区能够被许多的构件共享。
JavaScript单例模式实现⾃定义弹框本⽂实例为⼤家分享了JavaScript单例模式实现⾃定义弹框的具体代码,供⼤家参考,具体内容如下功能⾃定义弹框标题⾃定义弹框内容⾃定义弹框确认和关闭时的回调函数完整代码const Dialog = (function () {class Dialog {constructor () {this.ele = document.createElement('div')this.ele.className = 'dialog'document.body.appendChild(this.ele)this.callback = nullthis.setEvent()}setContent ({ text, topicText, confirmText, cancelText } = options) {this.ele.innerHTML = nullconst top = document.createElement('div')top.className = 'top'const topic = document.createElement('span')topic.className = 'topic'topic.innerHTML = topicTextconst close = document.createElement('span')close.className = 'close'close.innerHTML = '×'top.appendChild(topic)top.appendChild(close)const middle = document.createElement('div')middle.className = 'middle'const content = document.createElement('div')content.className = 'content'content.innerHTML = textmiddle.appendChild(content)const bottom = document.createElement('div')bottom.className = 'bottom'const confirm = document.createElement('button')confirm.className = 'confirm'confirm.innerHTML = confirmTextconst cancel = document.createElement('button')cancel.className = 'cancel'cancel.innerHTML = cancelTextbottom.appendChild(confirm)bottom.appendChild(cancel)const wrap = document.createElement('div')this.ele.appendChild(top)this.ele.appendChild(middle)this.ele.appendChild(bottom)this.ele.style.display = 'block'}setEvent () {this.ele.addEventListener('click', e => {e = e || window.eventconst target = e.target || e.srcElementif (target.className === 'close') {this.ele.style.display = 'none'console.log('close')}if (target.className === 'confirm') {this.ele.style.display = 'none'this.callback(true)}if (target.className === 'cancel') {this.ele.style.display = 'none'this.callback(false)}})}}let instance = nullreturn function (options, cb) {if (!instance) instance = new Dialog()instance.setContent(options)instance.callback = cb || function () {}return instance}})()const dialog = new Dialog({text: '提⽰⽂字',topicText: '标题',confirmText: '确定',cancelText: '取消'}, res => { console.log(res) })效果图以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
python-tkinter⾃定义tkinter风格的提⽰框博客园的密码终于找回了前⾔偶尔使⽤python要绘制个简单输⼊提⽰框或者复选框窗体,使⽤tkinter的话绘制窗体也是很⿇烦的,想着能不能把它⾃定义⼀个简单可复⽤的提⽰框。
然后便动⼿写了⼀下,效果还可以import tkinter as tkfrom tkinter import ttk,messageboxclass Dialog():def __init__(self):self.master=tk.Toplevel()self.master.withdraw()self.style=ttk.Style()self.master["background"]="#ffffff"self.style.configure("G.TLabel",font=('微软雅⿊',11),foreground='#00bbcc',background="#ffffff")self.style.configure('G.TFrame',background='#ffffff')self.style.configure("G.TCheckbutton",background="#ffffff")self.style.configure("G.TButton",background="#2b6e99",borderwidth=4)self.top=ttk.Frame(self.master,style="G.TFrame")self.middle=ttk.Frame(self.master,style="G.TFrame")self.bottom=ttk.Frame(self.master)self.top.pack(padx=10,fill="x")self.middle.pack(padx=10,pady=5,fill="x")self.bottom.pack(fill="both")self.result=Nonedef show(self):self.master.update()self.width,self.height=self.master.winfo_reqwidth(),self.master.winfo_reqheight()self.x,self.y=(self.master.winfo_screenwidth()-self.width)/2,(self.master.winfo_screenheight()-self.height)/2self.master.resizable(False,False)self.master.wm_attributes("-topmost",1)self.master.geometry('%dx%d+%d+%d' % (self.width, self.height, self.x, self.y))self.master.deiconify()self.master.grab_set()self.master.wait_window()return self.resultdef builder(self):return selfdef exit(self):self.master.destroy()def addConfirmCancelBtn(self):self.confirmBtn=ttk.Button(self.bottom,text="提交",style="G.TButton",command=self.confirm)self.confirmBtn.grid(row=0,column=0,padx=10,pady=10)self.cancelBtn=ttk.Button(self.bottom,text="取消",style="G.TButton",command=self.cancel)self.cancelBtn.grid(row=0,column=1,padx=10,pady=10)def addYesNoBtn(self):self.confirmBtn=ttk.Button(self.bottom,text="是",style="G.TButton",command=self.yes)self.confirmBtn.grid(row=0,column=0,padx=10,pady=10)self.cancelBtn=ttk.Button(self.bottom,text="否",style="G.TButton",command=self.no)self.cancelBtn.grid(row=0,column=1,padx=10,pady=10)def addOkBtn(self):bel(self.bottom,width=10).grid(row=0,column=0,padx=5,pady=5)self.cancelBtn=ttk.Button(self.bottom,text="确定",style="G.TButton",command=self.ok)self.cancelBtn.grid(row=0,column=1,padx=5,pady=5)def confirm(self):passdef cancel(self):passdef ok(self):passdef yes(self):passdef no(self):passclass InputDialog(Dialog):def __init__(self,title,dic):super().__init__()self.master.title(title)self.title=bel(self.top,text=title,style="G.TLabel")self.title.pack(fill="x")self.dic=dicdef builder(self):keys=list(self.dic.keys())for i in range(0,len(keys)):key=keys[i]val=self.dic[key]self.dic[key+"-k"]=bel(self.middle,text=key,font=('微软雅⿊',10),bg="#ffffff")self.dic[key+"-k"].grid(row=i,column=0,sticky="w")self.dic[key+"-v"]=tk.StringVar()self.dic[key+'-v'].set(val['text'])if val['type']=='password':ttk.Entry(self.middle,width=20,textvariable=self.dic[key+'-v'],show='*').grid(row=i,column=1,columnspan=2)else:ttk.Entry(self.middle,width=20,textvariable=self.dic[key+'-v']).grid(row=i,column=1,columnspan=2)self.addConfirmCancelBtn()return selfdef confirm(self):keys=list(self.dic.keys())for key in keys:if "-k" in key:del self.dic[key]if '-v' in key:val=self.dic[key].get()self.dic[str(key).strip("-v")]['text']=valdel self.dic[key]self.result=self.dicself.exit()def cancel(self):self.result=Noneself.exit()class AlertDialog(Dialog):def __init__(self,title,text):super().__init__()self.title=titleself.text=textdef show(self):return messagebox.showinfo(self.title,self.text)class CheckButtonDialog(Dialog):def __init__(self,title,dic):super().__init__()self.master.title(title)self.title = bel(self.top, text=title,style="G.TLabel")self.title.pack(fill="x")self.dic=dicdef builder(self):self.keys=list(self.dic.keys())for key in self.keys:self.dic[key+"-c"]=tk.IntVar()self.dic[key+"-c"].set(self.dic[key]["state"])ttk.Checkbutton(self.middle,text=key,variable=self.dic[key+"-c"],style="G.TCheckbutton").pack(pady=2,anchor="w",padx=10)self.addOkBtn()return selfdef ok(self):for key in self.keys:state=self.dic[key+"-c"].get()self.dic[key]["state"]=statedel self.dic[key+"-c"]self.result=self.dicself.exit()if __name__ =="__main__":root = ()tk.Button(root, text='对话框', command=lambda:print(AlertDialog("对话框举例","hello world").builder().show())).pack(pady=5)tk.Button(root,text="输⼊框",command=lambda:print(InputDialog("输⼊框举例",{"⽤户名":{"text":"零度热冰","type":"text"},"密码":{"text":"123456","type":"password"}}).builder().show())).pack(pady=5)tk.Button(root,text="多选框",command=lambda :print(CheckButtonDialog("多选框举例",{"CSDNCSDNCSDN":{"state":1},"博客园":{"state":0},"CSDN1":{"state":1},"博客园2":{"state":0}}).builder().show())).pack(pady=5) root.mainloop() 看看输⼊框效果 基本和tkinter提⽰框的风格差不多,但是唯⼀不好的是ttk button 的boderwidth属性好像不起作⽤show()之后会返回最终的结果多选框效果。
kotlin使⽤建造者模式⾃定义对话框本⽂实例为⼤家分享了kotlin⾃定义对话框的具体代码,供⼤家参考,具体内容如下monDialog 创建我们⾃⼰的对话框,继承于系统的Dialog 实现构造⽅法class CommonDialog(context: Context?, themeResId: Int) : Dialog(context, themeResId) {}2. 在内部创建BUilder类定义出我们需要的⽅法和属性class Builder (private val context: Context) {private var title: String? = nullprivate var message: String? = nullprivate var positiveButtonContent: String? = nullprivate var negativeButtonContent: String? = nullprivate var positiveButtonListener: DialogInterface.OnClickListener? = nullprivate var negativeButtonListener: DialogInterface.OnClickListener? = nullprivate var contentView: View? = nullprivate var imageid: Int = 0private var color: Int = 0private var withOffSize: Float = 0.toFloat()private var heightOffSize: Float = 0.toFloat()fun setTitle(title: String): Builder {this.title = titlereturn this}fun setTitle(title: Int): Builder {this.title = context.getText(title) as Stringreturn this}fun setMessage(message: String): Builder {this.message = messagereturn this}fun setMessageColor(color: Int): Builder {this.color = colorreturn this}fun setImageHeader(Imageid: Int): Builder {this.imageid = Imageidreturn this}fun setPositiveButton(text: String, listener: DialogInterface.OnClickListener): Builder {this.positiveButtonContent = textthis.positiveButtonListener = listenerreturn this}fun setPositiveButton(textId: Int, listener: DialogInterface.OnClickListener): Builder {this.positiveButtonContent = context.getText(textId) as Stringthis.positiveButtonListener = listenerreturn this}fun setNegativeButton(text: String, listener: DialogInterface.OnClickListener): Builder {this.negativeButtonContent = textthis.negativeButtonListener = listenerreturn this}fun setNegativeButton(textId: Int, listener: DialogInterface.OnClickListener): Builder {this.negativeButtonContent = context.getText(textId) as Stringthis.negativeButtonListener = listenerreturn thisfun setContentView(v: View): Builder {this.contentView = vreturn this}fun setWith(v: Float): Builder {this.withOffSize = vreturn this}fun setContentView(v: Float): Builder {this.heightOffSize = vreturn this}fun create(): CommonDialog {/*** 利⽤我们刚才⾃定义的样式初始化Dialog*/val dialog = CommonDialog(context,R.style.dialogStyle)/*** 下⾯就初始化Dialog的布局页⾯*/val inflater = context.getSystemService(YOUT_INFLATER_SERVICE) as LayoutInflaterval dialogLayoutView = inflater.inflate(yout.dialog_layout,null)dialog.addContentView(dialogLayoutView, youtParams(youtParams.WRAP_CONTENT, youtParams.WRAP_CONTENT))if (imageid != 0) {(dialogLayoutView.findViewById<View>(R.id.iv_image_header) as ImageView).setImageResource(imageid)} else {(dialogLayoutView.findViewById<View>(R.id.iv_image_header) as ImageView).visibility = View.GONE }if (!TextUtils.isEmpty(title)) {(dialogLayoutView.findViewById<View>(_dialog_title) as TextView).text = title} else {// Log.w(context.getClass().toString(), "未设置对话框标题!");}if (color != 0) {val viewById = dialogLayoutView.findViewById<View>(R.id.dialog_content) as TextViewviewById.setTextColor(color)}if (!TextUtils.isEmpty(message)) {(dialogLayoutView.findViewById<View>(R.id.dialog_content) as TextView).text = message} else if (contentView != null) {(dialogLayoutView.findViewById<View>(R.id.dialog_llyout_content) as LinearLayout).removeAllViews()(dialogLayoutView.findViewById<View>(R.id.dialog_llyout_content) as LinearLayout).addView(contentView, youtParams(youtParams.WRAP_CONTENT,youtParams.WRAP_CONTENT))} else {(dialogLayoutView.findViewById<View>(R.id.dialog_content) as TextView).visibility = View.INVISIBLE }if (!TextUtils.isEmpty(positiveButtonContent)) {(dialogLayoutView.findViewById<View>(_dialog_pos) as TextView).text = positiveButtonContent if (positiveButtonListener != null) {(dialog.findViewById<View>(_dialog_pos) as TextView).setOnClickListener { positiveButtonListener!!.onClick(dialog, -1) }}} else {(dialogLayoutView.findViewById<View>(_dialog_pos) as TextView).visibility = View.GONEdialogLayoutView.findViewById<View>(R.id.line).visibility = View.GONEif (!TextUtils.isEmpty(negativeButtonContent)) {(dialogLayoutView.findViewById<View>(_dialog_neg) as TextView).text = negativeButtonContent if (negativeButtonListener != null) {(dialogLayoutView.findViewById<View>(_dialog_neg) as TextView).setOnClickListener { negativeButtonListener!!.onClick(dialog, -2) }}} else {(dialogLayoutView.findViewById<View>(_dialog_neg) as TextView).visibility = View.GONE}/*** 将初始化完整的布局添加到dialog中*/dialog.setContentView(dialogLayoutView)/*** 禁⽌点击Dialog以外的区域时Dialog消失*/dialog.setCanceledOnTouchOutside(false)val window = dialog.windowval context = this.context as Activityval windowManager = context.windowManagerval defaultDisplay = windowManager.defaultDisplayval attributes = window!!.attributesif (withOffSize.toDouble() != 0.0) {attributes.width = (defaultDisplay.width * withOffSize).toInt()} else {attributes.width = (defaultDisplay.width * 0.77).toInt()}if (heightOffSize.toDouble() != 0.0) {attributes.height = (defaultDisplay.height * heightOffSize).toInt()}window.attributes = attributesreturn dialog}}3.在需要的地⽅使⽤CommonDialog.Builder(this).setImageHeader(R.mipmap.icon_gantan_tankuang).setTitle("你是否要注销账户").setMessage("注销后需重新注册才能使⽤⽜返返优惠").setPositiveButton("确定注销", DialogInterface.OnClickListener { p0, p1 ->p0?.dismiss()DestroyAccount()}).setNegativeButton("取消", DialogInterface.OnClickListener { p0, p1 -> p0?.dismiss() }).setWith(0.77f).create().show()实现效果:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
G t k C L i s t (分栏列表构件)是G t k L i s t (列表构件)的替代品,但它提供更多的特性。
分栏列表构件是多列列表构件,它有能力处理数千行的信息。
每一列都可以有一个标题,而且可以是活动的。
你还可以将函数绑定到列选择上。
--------------------------------------------------------------------------------创建分栏列表构件GtkCList创建G t k C l i s t构件的方法和创建其他构件的方法是类似的。
有两种方法,一种是容易的,一种是难的。
因为G t k C L i s t可以有多列,因而在创建它之前,必须确定要创建的列表的列数。
GtkWidget *gtk_clist_new ( gint columns );GtkWidget *gtk_clist_new_with_titles( gint columns,gchar *titles[] );第一种方式很简单,而第二种需要作一些解释。
每一列都可以有一个与之相联系的标题,标题可以是一个标签构件,或者是一个按钮,只要能够对我们的动作作出响应。
如果要使用第二种方式,则必须提供一个指向标题文本的指针,指针数目应该与列数相等。
当然,我们可以用第一种方式,然后再手工添加标题以达到相同的目的。
注意,分栏列表构件没有自己的滚动条,如果要提供滚动条功能,应该将分栏列表构件放在一个滚动窗口构件中。
--------------------------------------------------------------------------------操作模式有几个可以用于改变分栏列表构件行为的属性。
先看下面这个:void gtk_clist_set_selection_mode( GtkCList *clist,GtkSelectionMode mode );就像函数名所暗示的一样,它设置了分栏列表的选择模式。