搞了两天才搞清楚跑通 好难呢,个人电脑 win10 ,6GB显存
个人感觉 生成速度很慢,数学能力不怎么行 没有ChatGLM2-6B 强,逻辑还行,
要求:
我的部署流程
,下载所有文件 然后 放到新建的model目录
https://huggingface.co/baichuan-inc/Baichuan2-7B-Chat-4bits/tree/main
用conda创建一个新环境取名baichuan2
安装 requirements.txt 模块依赖
- torch >=2.0.0
- deepspeed==0.9.2
- numpy==1.23.5
- sentencepiece==0.1.97
- xformers==0.0.19
- bitsandbytes==0.41.1
- accelerate
- colorama
- streamlit
- transformers_stream_generator
- cpm_kernels
- $ conda list
- # packages in environment at C:\Users\Administrator\.conda\envs\baichuan2:
- #
- # Name Version Build Channel
- absl-py 1.4.0 pypi_0 pypi
- accelerate 0.23.0 pypi_0 pypi
- addict 2.4.0 pypi_0 pypi
- aiofiles 23.1.0 pypi_0 pypi
- aiohttp 3.8.5 pypi_0 pypi
- aiosignal 1.3.1 pypi_0 pypi
- aliyun-python-sdk-core 2.13.36 pypi_0 pypi
- aliyun-python-sdk-kms 2.16.2 pypi_0 pypi
- altgraph 0.17.3 pypi_0 pypi
- appdirs 1.4.4 pypi_0 pypi
- async-timeout 4.0.2 pypi_0 pypi
- attrs 23.1.0 pypi_0 pypi
- bitsandbytes 0.41.1 pypi_0 pypi
- blas 1.0 mkl https://repo.anaconda.com/pkgs/main
- bzip2 1.0.8 h8ffe710_4 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- ca-certificates 2023.01.10 haa95532_0 defaults
- cachetools 5.3.1 pypi_0 pypi
- certifi 2022.12.7 pypi_0 pypi
- cffi 1.15.1 pypi_0 pypi
- chardet 5.1.0 pypi_0 pypi
- charset-normalizer 3.1.0 pypi_0 pypi
- click 8.1.3 pypi_0 pypi
- colorama 0.4.6 pypi_0 pypi
- contourpy 1.1.0 pypi_0 pypi
- cpm-kernels 1.0.11 pypi_0 pypi
- crcmod 1.7 pypi_0 pypi
- cryptography 41.0.3 pypi_0 pypi
- cycler 0.11.0 pypi_0 pypi
- datasets 2.13.0 pypi_0 pypi
- diffusers 0.21.1 pypi_0 pypi
- dill 0.3.6 pypi_0 pypi
- einops 0.6.1 pypi_0 pypi
- exceptiongroup 1.1.1 pypi_0 pypi
- faker 8.8.1 pyhd3eb1b0_1 defaults
- ffmpy 0.3.0 pypi_0 pypi
- filelock 3.10.0 pypi_0 pypi
- fonttools 4.40.0 pypi_0 pypi
- frozenlist 1.3.3 pypi_0 pypi
- fsspec 2023.6.0 pypi_0 pypi
- gast 0.5.4 pypi_0 pypi
- google-auth 2.23.0 pypi_0 pypi
- google-auth-oauthlib 1.0.0 pypi_0 pypi
- grpcio 1.58.0 pypi_0 pypi
- h11 0.14.0 pypi_0 pypi
- huggingface-hub 0.17.1 pypi_0 pypi
- icetk 0.0.5 pypi_0 pypi
- idna 3.4 pypi_0 pypi
- importlib-metadata 6.8.0 pypi_0 pypi
- intel-openmp 2021.4.0 haa95532_3556 https://repo.anaconda.com/pkgs/main
- jieba 0.42.1 pypi_0 pypi
- jinja2 3.1.2 pypi_0 pypi
- jmespath 0.10.0 pypi_0 pypi
- jsonschema 4.17.3 pypi_0 pypi
- kiwisolver 1.4.4 pypi_0 pypi
- latex2mathml 3.76.0 pypi_0 pypi
- libffi 3.4.2 h8ffe710_5 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- libsqlite 3.40.0 hcfcfb64_0 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- libzlib 1.2.13 hcfcfb64_4 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- linkify-it-py 2.0.2 pypi_0 pypi
- m2w64-gcc-libgfortran 5.3.0 6 https://repo.anaconda.com/pkgs/msys2
- m2w64-gcc-libs 5.3.0 7 https://repo.anaconda.com/pkgs/msys2
- m2w64-gcc-libs-core 5.3.0 7 https://repo.anaconda.com/pkgs/msys2
- m2w64-gmp 6.1.0 2 https://repo.anaconda.com/pkgs/msys2
- m2w64-libwinpthread-git 5.0.0.4634.697f757 2 https://repo.anaconda.com/pkgs/msys2
- markdown 3.4.3 pypi_0 pypi
- markdown-it-py 2.2.0 pypi_0 pypi
- markupsafe 2.1.2 pypi_0 pypi
- matplotlib 3.7.1 pypi_0 pypi
- mdtex2html 1.2.0 pypi_0 pypi
- mdurl 0.1.2 pypi_0 pypi
- mkl 2021.4.0 haa95532_640 https://repo.anaconda.com/pkgs/main
- mkl-service 2.4.0 py310h2bbff1b_0 https://repo.anaconda.com/pkgs/main
- mkl_fft 1.3.1 py310ha0764ea_0 https://repo.anaconda.com/pkgs/main
- mkl_random 1.2.2 py310h4ed8f06_0 https://repo.anaconda.com/pkgs/main
- modelscope 1.9.1 pypi_0 pypi
- mpmath 1.3.0 pypi_0 pypi
- ms-swift 1.0.0 pypi_0 pypi
- msys2-conda-epoch 20160418 1 https://repo.anaconda.com/pkgs/msys2
- multidict 6.0.4 pypi_0 pypi
- multiprocess 0.70.14 pypi_0 pypi
- mypy-extensions 1.0.0 pypi_0 pypi
- networkx 3.0 pypi_0 pypi
- numpy 1.24.2 pypi_0 pypi
- numpy-base 1.23.5 py310h04254f7_0 https://repo.anaconda.com/pkgs/main
- oauthlib 3.2.2 pypi_0 pypi
- openssl 3.1.0 hcfcfb64_0 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- orjson 3.9.1 pypi_0 pypi
- oss2 2.18.1 pypi_0 pypi
- packaging 23.0 pypi_0 pypi
- pandas 2.0.3 pypi_0 pypi
- pefile 2023.2.7 pypi_0 pypi
- peft 0.5.0 pypi_0 pypi
- pillow 9.4.0 pypi_0 pypi
- pip 23.2.1 pypi_0 pypi
- platformdirs 3.10.0 pypi_0 pypi
- protobuf 4.24.3 pypi_0 pypi
- psutil 5.9.5 pypi_0 pypi
- pyarrow 13.0.0 pypi_0 pypi
- pyasn1 0.5.0 pypi_0 pypi
- pyasn1-modules 0.3.0 pypi_0 pypi
- pycparser 2.21 pypi_0 pypi
- pycryptodome 3.19.0 pypi_0 pypi
- pydantic 1.10.10 pypi_0 pypi
- pydub 0.25.1 pypi_0 pypi
- pygments 2.15.1 pypi_0 pypi
- pyinstaller 5.9.0 pypi_0 pypi
- pyinstaller-hooks-contrib 2023.1 pypi_0 pypi
- pyparsing 3.1.0 pypi_0 pypi
- pyre-extensions 0.0.29 pypi_0 pypi
- pyrsistent 0.19.3 pypi_0 pypi
- python 3.10.2 hcf16a7b_4_cpython http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- python-dateutil 2.8.2 pyhd3eb1b0_0 defaults
- python-multipart 0.0.6 pypi_0 pypi
- pytz 2023.3 pypi_0 pypi
- pywin32-ctypes 0.2.0 pypi_0 pypi
- pyyaml 6.0 pypi_0 pypi
- regex 2022.10.31 pypi_0 pypi
- requests 2.28.2 pypi_0 pypi
- requests-oauthlib 1.3.1 pypi_0 pypi
- rsa 4.9 pypi_0 pypi
- safetensors 0.3.3 pypi_0 pypi
- scipy 1.11.2 pypi_0 pypi
- semantic-version 2.10.0 pypi_0 pypi
- sentencepiece 0.1.97 pypi_0 pypi
- setuptools 68.2.2 pypi_0 pypi
- simplejson 3.19.1 pypi_0 pypi
- six 1.16.0 pyhd3eb1b0_1 https://repo.anaconda.com/pkgs/main
- sniffio 1.3.0 pypi_0 pypi
- sortedcontainers 2.4.0 pypi_0 pypi
- sqlite 3.40.0 hcfcfb64_0 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- sympy 1.11.1 pypi_0 pypi
- tensorboard 2.14.0 pypi_0 pypi
- tensorboard-data-server 0.7.1 pypi_0 pypi
- text-unidecode 1.3 pyhd3eb1b0_0 defaults
- thulac 0.2.2 pypi_0 pypi
- tk 8.6.12 h8ffe710_0 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- tokenizers 0.13.2 pypi_0 pypi
- tomli 2.0.1 pypi_0 pypi
- toolz 0.12.0 pypi_0 pypi
- torch 2.0.0+cu117 pypi_0 pypi
- torchvision 0.15.1 pypi_0 pypi
- tqdm 4.65.0 pypi_0 pypi
- transformers 4.33.2 pypi_0 pypi
- typing-extensions 4.7.0 pypi_0 pypi
- typing-inspect 0.9.0 pypi_0 pypi
- tzdata 2023.3 pypi_0 pypi
- uc-micro-py 1.0.2 pypi_0 pypi
- ucrt 10.0.22621.0 h57928b3_0 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- unicodecsv 0.14.1 pypi_0 pypi
- unihan-etl 0.18.1 pypi_0 pypi
- urllib3 1.26.15 pypi_0 pypi
- uvicorn 0.22.0 pypi_0 pypi
- vc 14.3 hb6edc58_10 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- vs2015_runtime 14.34.31931 h4c5c07a_10 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- websockets 11.0.3 pypi_0 pypi
- werkzeug 2.3.7 pypi_0 pypi
- wheel 0.40.0 pyhd8ed1ab_0 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- word2vec 0.9.4 py310h9909e9c_0 https://repo.anaconda.com/pkgs/main
- xformers 0.0.19 pypi_0 pypi
- xxhash 3.3.0 pypi_0 pypi
- xz 5.2.6 h8d14728_0 http://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
- yapf 0.40.1 pypi_0 pypi
- yarl 1.9.2 pypi_0 pypi
- zhon 1.1.5 pypi_0 pypi
- zipp 3.16.2 pypi_0 pypi
新建一个run.py文件,放到解压的源码文件夹,以及 model 目录也移到过去
- import torch
- from transformers import AutoModelForCausalLM, AutoTokenizer
- from transformers.generation.utils import GenerationConfig
- import os
-
- # 获取当前文件所在的目录路径
- current_dir = os.path.dirname(os.path.abspath(__file__))
- # 将当前目录和'model'连接起来,获得'model'文件夹的完整路径
- model_path = os.path.join(current_dir, 'model')
- print('model_path=', model_path)
-
-
- if __name__ == '__main__':
- tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True)
- model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True)
- model.generation_config = GenerationConfig.from_pretrained(model_path)
- messages = []
- messages.append({"role": "user", "content": "解释一下“温故而知新”"})
- response = model.chat(tokenizer, messages)
- print(response)
在创建一个run.bat文件
-
- call activate baichuan2
-
- python ./run.py
-
- pause
双击run.bat 就运行模型了
- 你好
- AI:你好今天我能为您提供什么帮助?
-
- numbers由几个字母组成?
- AI:是由五个字母组成的单词。
-
- 将"numbers"这个字符串进行倒序输出:
- AI: 输出结果为:"dsna"
-
- 小明45元卖出一顶帽子,收到一张100元假钞,找零55元,帽子进货价15元一顶,如果小明不知道他收到的是一张假钞,请问小明亏了多少钱?
- AI: 首先,我们需要计算小明卖帽子的总收入。他收到了100元的假钞,所以实际上他收到的现金是90元(100 - 55 = 90)。然后,他以45元的价格卖出了这顶帽子,所以收入为45元。
- 现在我们来计算小明的亏损。他进货成本是一顶帽子的价格,即15元。他卖出的帽子收入是45元,进货成本也是15元,所以他实际亏损了(45 - 15)元,即30元。
-
- 改正语句:你到看的时一片精菜的说小,描了述小王在禛上遇道阿sir的故式。
- AI: 当你看到的时候,描述小王在桌子上遇到阿sir的情景。
-
- 用5个1怎么计算得到6?
- AI: 你可以使用以下数学运算来从五个1中计算出6:
-
- 1. 加法:将五个1相加,即 1 + 1 + 1 + 1 + 1 = 5。然后从结果中减去1(因为已经有一个1了),得到4。最后加上1,得到最终结果5 。所以,通过加法得到的答案是5。
-
- 2. 减法:从六个数(6 = 5 + 1)中减去五个1,得到一个1。所以,通过减法得到的答案是1。
-
- 3. 乘法:将五个1相乘,即 1 * 1 * 1 * 1 * 1 = 1。所以,通过乘法得到的答案是1。
-
- 4. 除法:将六个数(6 = 5 + 1)除以五个1,得到一个1。所以,通过除法得到的答案是1。
-
- 请注意,这些计算方法都得到了相同的答案:1。这意味着在五种情况下,你都可以通过将五个1相加或相乘来得到6。
-
-
- 有一串彩珠,按2红3绿4黄的顺序依次排列,第600颗是什么颜色?
- AI:首先,我们需要找到这600个彩珠中的第600颗。因为每个周期有8个彩珠(2红3绿4黄),所以600个彩珠可以分为8个这样的周期。因此,我们只需将600除以8,得到75,即有75个完整的周期。
-
- 现在我们知道第600颗彩珠位于一个完整的周期中。这个周期的顺序是2红3绿4黄,所以我们可以通过以下步骤来确定第600颗彩珠的颜色 :
-
- 1. 首先,我们确定第600颗彩珠是否在红色区域。如果它在红色区域,那么它就是红色的;否则,它必须在绿色或黄色的区域。
-
- 2. 如果第600颗彩珠在红色区域,那么它是一个2红。由于我们有75个完整的周期,这意味着第600颗彩珠是这75个2红中的某一个。但是 ,我们不能直接确定它是第600颗2红,因为我们还需要知道每个周期内2红的顺序。
-
- 3. 为了确定第600颗彩珠是第几颗2红,我们需要计算75个2红在顺序上的位置。由于每个周期都有8个彩珠,所以每个2红占据了一个完整的周期的一半。因此,75个2红占据了75/2=37.5个完整周期。由于我们不能有半个周期,我们需要向上取整,这意味着实际上有38个完整周期包含2红。
-
- 4. 现在我们已经确定了第600颗彩珠是这38个2红中的某一个。要确定它是第几颗2红,我们需要计算38个2红在顺序上的位置。由于每个2红都占据了一个完整周期的半数,所以38个2红占据了38*2=76个完整周期的半数。由于每个周期有8个彩珠,所以38个2红占据了38/2=19 个完整周期的数量。
-
- 5. 最后,我们需要计算19个完整周期的顺序。由于每个周期都有8个彩珠,所以19个完整周期的数量等于19*8=152个彩珠。这意味着第600颗彩珠是这152个彩珠中的某一个。要确定它是第几颗彩珠,我们需要计算152个彩珠在顺序上的位置。由于每个彩珠都是一个单独的单 元,所以我们只需要计数即可。从0开始计数,第600颗彩珠的位置就是152。
-
- 综上所述,第600颗彩珠是黄色。
-
-
- 列出最常见的20中水果名称
- AI:
- 1.苹果 (Apple)
- 2. 香蕉 (Banana)
- 3. 橙子 (Orange)
- 4. 葡萄 (Grape)
- 5. 西瓜 (Watermelon)
- 6. 柠檬 (Lemon)
- 7. 草莓 (Strawberry)
- 8. 菠萝 (Pineapple)
- 9. 樱桃 (Cherry)
- 10. 猕猴桃 (Kiwi)
- 11. 火龙果 (Dragon Fruit)
- 12. 柿子 (Fig)
- 13. 桃子 (Peach)
- 14. 李子 (Apricot)
- 15. 杏子 (Almond)
- 16. 石榴 (Pomegranate)
- 17. 木瓜 (Papaya)
- 18. 芒果 (Mango)
- 19. 蓝莓 (Blueberry)
- 20. 黑莓 (Blackberry)
-
- 用户:0 - 187 次
- 1 - 100 次
- 2 - 225 次
- 3 - 128 次
- 4 - 64 次
- 5 - 92 次
- 6 - 69 次
- 7 - 206 次
- 8 - 127 次
- 9 - 65 次
- 按次数从大到小排序
- ------------------------------------------------------------------------------
- AI:根据您提供的数据,我已经将它们按照次数从大到小排序:
-
- 1 - 100 次
- 2 - 225 次
- 3 - 128 次
- 4 - 64 次
- 5 - 92 次
- 6 - 69 次
- 7 - 206 次
- 8 - 127 次
- 9 - 65 次
- 0 - 187 次
- ==============================================================================
-
-
- 用户:7年前,妈妈的年龄是儿子的6倍,儿子今年12岁,妈妈今年几岁?
- ------------------------------------------------------------------------------
- AI:这是一个关于线性方程的问题。在这个问题中,我们需要找到一个方程来表示父母和孩子的年龄关系,然后通过给定的条件求解出母亲的年龄。
- 首先,我们知道儿子的年龄是12岁。7年前,他的年龄是5岁(因为7年前妈妈的年龄是他的6倍,所以那时她的年龄是 5 * 6 = 30岁)。现在,儿子已经12岁了,所以我们可以得出一个方程:
- 母亲的年龄 = 儿子的年龄 + 7
- ==============================================================================
-
-
- 用户:以“会心之乐”为题的600字作文
- ------------------------------------------------------------------------------
- AI:会心之乐
-
- 在这个快节奏的现代社会,人们往往被各种压力所困扰,生活的压力让我们忘记了如何去欣赏生活中的美好。然而,当我们学会去发现生活中的美好时,我们会发现一种叫做“会心之乐”的东西。它如同阳光般温暖人心,如同清泉般滋润心灵。
-
- 会心之乐,是一种发自内心的喜悦。它源于我们对生活的热爱,对自然的敬畏,对他人的关爱。当我们看到孩子天真烂漫的笑容时,我们会心一笑,这就是会心之乐;当我们看到一对恋人手牵手漫步在夕阳下时,我们会心一笑,这也是会心之乐。会心之乐,是一种简单而美好的情感,它让我们感受到生活的美好,让我们更加珍惜当下。
-
- 会心之乐,是一种心灵的慰藉。在这个纷繁复杂的世界里,我们往往会因为各种琐事而烦恼,但是当我们找到一种让自己放松的方式时,我们会心一笑,这就是会心之乐。无论是阅读一本好书,还是聆听一首美妙的歌曲,亦或是品尝一道美味的佳肴,都会让我们感受到会心之乐。这种快乐,让我们在面对困难时,更加坚定信心,让我们在疲惫时,更加热爱生活。
-
- 会心之乐,是一种成长的体验。成长的过程中,我们会遇到各种各样的挑战,但是当我们克服这些挑战时,我们会心一笑,这就是会心之乐。无论是学习一门新技能,还是完成一个艰巨的任务,我们都会在这个过程中感受到会心之乐。这种快乐,让我们更加珍惜每一个成长的时刻,让我们更加感激每一个陪伴我们的人。
-
- 会心之乐,是一种友谊的见证。在这个世界上,有一种感情叫做友谊,它如同阳光一般温暖人心。当我们与朋友分享喜悦,分担痛苦时,我们会心一笑,这就是会心之乐。这种快乐,让我们更加珍惜身边的朋友,让我们更加懂得彼此的陪伴。
-
- 总之,会心之乐是一种源自内心的喜悦,是一种心灵的慰藉,是一种成长的体验,是一种友谊的见证。它让我们更加热爱生活,更加珍惜当下,更加感激每一个陪伴我们的人。让我们学会去发现生活中的美好,去感受会心之乐,让我们的生活变得更加美好。
,没有历史功能,懒得研究了
- import tkinter as tk
- import torch
- from transformers import AutoModelForCausalLM, AutoTokenizer
- from transformers.generation.utils import GenerationConfig
- import os
-
-
- # 获取当前文件所在的目录路径
- current_dir = os.path.dirname(os.path.abspath(__file__))
- # 将当前目录和'model'连接起来,获得'model'文件夹的完整路径
- model_path = os.path.join(current_dir, 'model')
- print('model_path=', model_path)
-
-
- tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True)
- model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True)
- model.generation_config = GenerationConfig.from_pretrained(model_path)
-
-
-
- def write_file(text):
- with open(save_path, 'a', encoding='utf-8') as f:
- f.write(text + '\n')
-
- history=[]
- def answer(question):
- global history
- history=[]
- history.append({"role": "user", "content": question})
- response = model.chat(tokenizer, history)
- print(f"Response from model: {response}") # Add this line for debugging
- return response
-
-
- # 创建主窗口
- root = tk.Tk()
- root.title("Baichuan2")
- root.geometry("800x600+{}+{}".format(root.winfo_screenwidth() // 2 - 400, root.winfo_screenheight() // 2 - 350))
-
- # 创建输入框和滚动条
- input_frame = tk.Frame(root)
-
- clear_button = tk.Button(root, text="清空", width=6, height=3)
-
-
- def clear_output():
- global history
- output_text.delete("1.0", tk.END)
- history=[]
-
-
-
- clear_button.config(command=clear_output)
- clear_button.pack(side="right", padx=60)
-
- # 创建输出框和滚动条
- output_frame = tk.Frame(root)
- output_label = tk.Label(output_frame, text="AI:")
- output_text = tk.Text(output_frame, height=26, width=87, padx=6, pady=6)
- output_scrollbar = tk.Scrollbar(output_frame)
- output_text.config(yscrollcommand=output_scrollbar.set)
- output_scrollbar.config(command=output_text.yview)
- output_label.pack(side="left", pady=10)
- output_text.pack(side="left", pady=10)
- output_scrollbar.pack(side="right", fill="y")
- output_frame.pack()
-
- output_text.tag_config("user", foreground='green')
- output_text.tag_config("ai", background='orange', foreground='white')
-
-
- input_label = tk.Label(input_frame, text="用户:")
- input_text = tk.Text(input_frame, height=10, width=67, padx=6, pady=6)
- input_scrollbar = tk.Scrollbar(input_frame)
- input_text.config(yscrollcommand=input_scrollbar.set)
- input_scrollbar.config(command=input_text.yview)
- input_label.pack(side="left")
- input_text.pack(side="left", pady=10)
- input_scrollbar.pack(side="right", fill="y")
- input_frame.pack()
-
-
- def show_text():
- # 清空 Tkinter Text 组件中的文本
- # output_text.delete('1.0', 'end')
- question = input_text.get("1.0", "end-1c")
- result = answer(question)
- output_text.insert("end", "用户:" + question, "user")
- output_text.insert("end", "\n" + '-'*78)
- output_text.insert("end", "\nAI:" + result)
- output_text.insert("end", '\n'+"="*78)
- output_text.insert("end", "\n\n\n")
- # 滚动到最底部
- output_text.yview_moveto(1.0)
- input_text.delete('1.0', 'end')
-
-
- # 创建按钮
- button_frame = tk.Frame(root)
- button = tk.Button(button_frame, text="回答", command=show_text, width=6, height=3)
- # 响应回车键 绑定
事件 - root.bind("
" , lambda event: show_text()) -
-
- def copy():
- global text
- text.event_generate("<
>" ) -
-
- def cut():
- global text
- text.event_generate("<
>" ) -
-
- def paste():
- global text
- text.event_generate("<
>" ) -
-
- # 创建右键菜单
- menu = tk.Menu(root, tearoff=0)
- menu.add_command(label="复制", command=copy)
- menu.add_command(label="剪切", command=cut)
- menu.add_command(label="粘贴", command=paste)
-
-
- # 绑定鼠标右键(第一个文本框)
- def show_menu1(event):
- global text
- text = input_text
- menu.post(event.x_root, event.y_root)
-
-
- input_text.bind("
" , show_menu1) -
-
- # 绑定鼠标右键(第二个文本框)
- def show_menu2(event):
- global text
- text = output_text
- menu.post(event.x_root, event.y_root)
-
-
- output_text.bind("
" , show_menu2) -
- button.pack(side="right", padx=60)
- button_frame.pack()
-
- root.lift()
- # 运行主循环
- root.mainloop()